UDP ノンブロッキング ソケットを設定しました。ソケットを作成してバインドし、次のようにマルチキャスト グループに参加しています。
int hopLimit = 1;
int bAllowMultiple = 1;
in_addr localAddr;
localAddr.s_addr = 0;
in_addr groupAddress;
groupAddress.s_addr = inet_addr(ADDRESS);
sockaddr_in groupEndPoint;
groupEndPoint.sin_family = AF_INET;
groupEndPoint.sin_addr = groupAddress;
groupEndPoint.sin_port = htons(PORT);
SOCKET udpsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(udpsocket == -1){
printf("Socket fail\n%d\n", errno);
return 1;
}
if(setsockopt(udpsocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&hopLimit, sizeof(hopLimit))==-1){
printf("sockopt failed: IP_MULTICAST_TTL\n%d\n", errno);
return 1;
}
if(setsockopt(udpsocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localAddr, sizeof(localAddr))==-1){
printf("sockopt failed: IP_MULTICAST_IF\n%d\n", errno);
return 1;
}
if(setsockopt(udpsocket, SOL_SOCKET, SO_REUSEADDR, &bAllowMultiple, sizeof(bAllowMultiple))==-1){
printf("sockopt failed: SO_REUSEADDR\n%d\n", errno);
return errno;
}
// Set to non-blocking mode
unsigned long bMode = 1;
if(ioctl( udpsocket, FIONBIO, &bMode )==-1){
printf("ioctl failed\n%d\n", errno);
return errno;
}
sockaddr_in localEndPoint;
localEndPoint.sin_family = AF_INET;
localEndPoint.sin_addr.s_addr = localAddr.s_addr;
localEndPoint.sin_port = groupEndPoint.sin_port;
// Bind the socket to the port
int r = bind(udpsocket, (sockaddr*)&localEndPoint, sizeof(localEndPoint));
if (r != 0)
{
printf("Bind failed\n%d\n", errno);
return errno;
}
// Join the multicast group
struct ip_mreq imr;
imr.imr_multiaddr = groupEndPoint.sin_addr;
imr.imr_interface.s_addr = groupEndPoint.sin_addr.s_addr;
r = setsockopt(udpsocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr));
printf("%d\n",r);
if (r == -1){
printf("sockopt failed: IP_ADD_MEMBERSHIP\n%d\n", errno);
return errno;
}
最初の 3 つの setsockopt 呼び出し (MULTICAST_TTL、MULTICAST-IF、および REUSEADDRESS) は正常に機能し、バインドされます。その後、マルチキャスト グループに参加しようとすると、errno 19 - Device Not Found が返されます。imr インターフェイス アドレスを INADDR_ANY に変更すると、デバイスは検出されますが、プログラムはパケットを受信しません。ADDRESS を変更しました。マルチキャスト範囲内であることはわかっています。私のマシンの eth0 ではマルチキャストが有効になっています。インターフェイスを使用struct ip_mreqn imr
して変更し、適切に対処しましたが、変更はありません。スタック トレースを実行しましたが、それ以上の情報はありません。setsockopt が errno 19 で失敗したというだけです。
誰にもアイデアはありますか?私はここで少し絶望的です。私はこれをあまりにも長く続けてきました。