0

Apple の mDNS の実装を構築する場合、別名。ボンジュール、通称。posix システム用の mDNSResponder ( http://www.opensource.apple.com/tarballs/mDNSResponder/ ) [*]

  • クリーンなUbuntu 14.04ビルド ボックス (のみbuild-essentials, g++) では、コンパイルされた例は機能せず、報告され"bind: Address already in use"ます。

  • クリーンなDebian 7ビルド ボックス (のみbuild-essentials, g++) では、コンパイルされたサンプルは動作しますが、報告されません"bind: Address already in use"

ここで何が起こっているのですか?

[*] これは... バグだらけです。健全性のために、バージョン 333.10 または 541 を使用し、umondo プロジェクトからパッチを適用することをお勧めします: https://github.com/tklab-tud/umundo/tree/master/contrib/archives

4

2 に答える 2

0

問題は、次の違いによるものです/usr/include/asm-generic/socket.h

socket.h問題はlinux-libc-dev パッケージの一部です。

ではDebiansocket.hバージョン3.2.65のからのものでlinux-libc-dev、含むにはコメント行が含まれています

/* To add :#define SO_REUSEPORT 15 */

オンUbuntulinux-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、ソケットのバインディングの問題はなくなります。すなわち:

#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。私の理解が正しければ、優先度は元の順序で維持されるはずです。

于 2015-02-27T07:54:04.207 に答える