为了使示例在macOS上工作,删除了SO_REUSEPORT。
Socket programming - setsockopt: Protocol not available?
但macOS上的man setsockopt清楚地记录了选项SO_REUSEPORT。
SO_REUSEPORT enables duplicate address and port bindings为什么要删除SO_REUSEPORT才能创建示例?macOS上的setsockopt()中有bug吗?macOS上的setsockopt()源代码在哪里?
发布于 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 )实现它。通过它,你可以看到两件事:
#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:
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),
...https://stackoverflow.com/questions/66478217
复制相似问题