gpt4 book ai didi

c - POSIX Bonjour/mDNSResponder 测试示例在 Ubuntu 上报告 "bind: Address already in use",但在 Debian 上则不然

转载 作者:行者123 更新时间:2023-11-30 17:19:51 28 4
gpt4 key购买 nike

在构建 Apple 的 mDNS 实现时,又名。你好,又名。 posix 系统的 mDNSResponder ( http://www.opensource.apple.com/tarballs/mDNSResponder/ ) [*]

  • 在干净的 Ubuntu 14.04 构建盒(仅包含 build-essentials、g++)上,编译的示例无法工作 ,并报告“绑定(bind):地址已在使用中”

  • 在干净的 Debian 7 构建箱上(仅包含 build-essentials、g++),编译后的示例可以工作,并且不要报告“绑定(bind):地址已在使用中”

这是怎么回事?

[*] 这...充满了错误。为了保持理智,我建议使用版本 333.10 或 541,并应用 umondo 项目的补丁:https://github.com/tklab-tud/umundo/tree/master/contrib/archives

最佳答案

该问题是由于 /usr/include/asm-generic/socket.h 中存在以下差异所致

有问题的socket.hlinux-libc-dev包的一部分。

Debian 中,socket.h 来自 linux-libc-dev3.2.65 版本,并且包含包含注释行

/* To add :#define SO_REUSEPORT 15 */

Ubuntu 上,linux-libc-dev 版本为 3.13.0socket.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,就不再存在套接字绑定(bind)问题。即:

#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 中进行测试,如果我理解正确的话,也许应该将优先级保持在原来的顺序。

关于c - POSIX Bonjour/mDNSResponder 测试示例在 Ubuntu 上报告 "bind: Address already in use",但在 Debian 上则不然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com