SENDINGマルチキャストソケットとRECEIVINGマルチキャストソケットを区別することも非常に重要です。
RECEIVINGマルチキャストソケットに関する上記のすべての回答に同意します。OPは、RECEIVINGソケットをインターフェイスにバインドしても効果がないことを指摘しました。ただし、マルチキャストSENDINGソケットをインターフェイスにバインドする必要があります。
マルチホームサーバー上のSENDINGマルチキャストソケットの場合、送信先のインターフェイスごとに個別のソケットを作成することが非常に重要です。バインドされたSENDINGソケットは、インターフェイスごとに作成する必要があります。
// This is a fix for that bug that causes Servers to pop offline/online.
// Servers will intermittently pop offline/online for 10 seconds or so.
// The bug only happens if the machine had a DHCP gateway, and the gateway is no longer accessible.
// After several minutes, the route to the DHCP gateway may timeout, at which
// point the pingponging stops.
// You need 3 machines, Client machine, server A, and server B
// Client has both ethernets connected, and both ethernets receiving CITP pings (machine A pinging to en0, machine B pinging to en1)
// Now turn off the ping from machine B (en1), but leave the network connected.
// You will notice that the machine transmitting on the interface with
// the DHCP gateway will fail sendto() with errno 'No route to host'
if ( theErr == 0 )
{
// inspired by 'ping -b' option in man page:
// -b boundif
// Bind the socket to interface boundif for sending.
struct sockaddr_in bindInterfaceAddr;
bzero(&bindInterfaceAddr, sizeof(bindInterfaceAddr));
bindInterfaceAddr.sin_len = sizeof(bindInterfaceAddr);
bindInterfaceAddr.sin_family = AF_INET;
bindInterfaceAddr.sin_addr.s_addr = htonl(interfaceipaddr);
bindInterfaceAddr.sin_port = 0; // Allow the kernel to choose a random port number by passing in 0 for the port.
theErr = bind(mSendSocketID, (struct sockaddr *)&bindInterfaceAddr, sizeof(bindInterfaceAddr));
struct sockaddr_in serverAddress;
int namelen = sizeof(serverAddress);
if (getsockname(mSendSocketID, (struct sockaddr *)&serverAddress, (socklen_t *)&namelen) < 0) {
DLogErr(@"ERROR Publishing service... getsockname err");
}
else
{
DLog( @"socket %d bind, %@ port %d", mSendSocketID, [NSString stringFromIPAddress:htonl(serverAddress.sin_addr.s_addr)], htons(serverAddress.sin_port) );
}
この修正がないと、マルチキャスト送信は断続的にsendto()errno'ホストへのルートがありません'を取得します。DHCPゲートウェイのプラグを抜くと、Mac OS XマルチキャストSENDINGソケットが混乱する理由を誰かが明らかにできるなら、私はそれを聞きたいです。