首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setsockopt()的macOS SO_REUSEPORT

setsockopt()的macOS SO_REUSEPORT
EN

Stack Overflow用户
提问于 2021-03-04 23:34:24
回答 1查看 78关注 0票数 1

为了使示例在macOS上工作,删除了SO_REUSEPORT。

Socket programming - setsockopt: Protocol not available?

但macOS上的man setsockopt清楚地记录了选项SO_REUSEPORT。

代码语言:javascript
复制
SO_REUSEPORT    enables duplicate address and port bindings

为什么要删除SO_REUSEPORT才能创建示例?macOS上的setsockopt()中有bug吗?macOS上的setsockopt()源代码在哪里?

EN

回答 1

Stack Overflow用户

发布于 2021-08-18 19:46:25

SO_REUSEPORT是secsockopt的一个选项,所以它的源代码在内核中。这是xnu的源代码,特别是sys调用处理程序检查有效性(bsd/kern/uipc_socket.c)和IPv4/v6堆栈(分别是bsd/netinet/in_pcb.c和bsd/netinet6/in6_pcb.c )实现它。通过它,你可以看到两件事:

  1. SO_REUSEPORT和SO_REUSEADDR实际上在许多情况下可以互换工作(例如多播)。
  2. 当放入两个setsockopt(2)调用时,它也可以在您提到的示例中工作:错误是选项不是位掩码,所以|和+不能与它们一起工作-即使

代码语言:javascript
复制
#define SO_REUSEADDR    0x0004          /* allow local address reuse */
#define SO_REUSEPORT    0x0200          /* allow local address & port reuse */

在内核中作为位掩码使用(|'ed),内核中处理getsockopt和检查有效性的代码使用switch语句,所以最终这两个选项都不会被使用,因为它不属于这些情况。具体来说,它是bsd/kern/uipc_socket.c:

代码语言:javascript
复制
int  sosetoptlock(struct socket *so, struct sockopt *sopt, int dolock)
    {
    . ...
       switch (sopt->sopt_name) {
      . ..
       case SO_REUSEADDR:
                    case SO_REUSEPORT:
                    case SO_OOBINLINE:
                    case SO_TIMESTAMP:
                    case SO_TIMESTAMP_MONOTONIC:
                    case SO_TIMESTAMP_CONTINUOUS:
                    case SO_DONTTRUNC:
                    case SO_WANTMORE:
                    case SO_WANTOOBFLAG:
                    case SO_NOWAKEFROMSLEEP:
                    case SO_NOAPNFALLBK:
                            error = sooptcopyin(sopt, &optval, sizeof(optval),
     ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66478217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档