问题是由于以下差异造成的/usr/include/asm-generic/socket.h
有socket.h
问题的是linux-libc-dev
包装的一部分。
在Debian
,socket.h
来自 的版本3.2.65
, linux-libc-dev
contains 包含注释行
/* To add :#define SO_REUSEPORT 15 */
上Ubuntu
,linux-libc-dev
是版本3.13.0
。socket.h
. 在这里,该行不再被注释掉:
#define SO_REUSEPORT 15
当然,问题不在于linux-libc-dev
,而在于这个宏的使用,mDNSPosix.c
尤其是以下几行:
#if defined(SO_REUSEPORT)
err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
#elif defined(SO_REUSEADDR)
err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEADDR, &kOn, sizeof(kOn));
#else
#error This platform has no way to avoid address busy errors on multicast.
#endif
通过交换顺序,优先级SO_REUSEADDR
,不再存在套接字绑定问题。IE:
#if defined(SO_REUSEADDR)
err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEADDR, &kOn, sizeof(kOn));
#elif defined(SO_REUSEPORT)
err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
#else
#error This platform has no way to avoid address busy errors on multicast.
#endif
注意:此更改尚未在 中进行测试BSD
,如果我理解正确,可能应该保持优先级的顺序。