私の使命は、センサーデバイスからデータを取得することです。 Wiresharkを使用すると、次の情報をキャプチャできます。
10.13.1.113から224.0.2.2(マルチキャストアドレス)に情報を送信します。送信元ポート 42402、宛先ポート 42102)。
Ubuntu 20.04を使用しており、以下の簡単なコードを使用しています。
int main(int argc, char* argv[])
{
char* lcAddrIp = "10.13.1.102";
char* mcAddrIp = "224.0.2.2";
unsigned short mcPort = 42102;
struct sockaddr_in mcAddr;
memset(&mcAddr,0,sizeof(mcAddr));
// establish socket
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0)
{
printf("socket established failed, exit!");
return -1;
}
// multicast configure
mcAddr.sin_family = AF_INET;
mcAddr.sin_addr.s_addr = inet_addr(mcAddrIp);
mcAddr.sin_port = htons(42102);
unsigned int mcAddrLen = sizeof(mcAddr);
if (bind(sockfd, (struct sockaddr *)&mcAddr, mcAddrLen) <0)
{
printf("Can't bind socket to local port. exit\n");
return -1;
}
// Set multicast
ip_mreq mreq;
memset(&mreq, 0, sizeof(struct ip_mreq));
mreq.imr_multiaddr.s_addr = inet_addr(mcAddrIp);
mreq.imr_interface.s_addr = inet_addr(lcAddrIp);
if (setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
{
printf("SET IP_ADD_MEMBERSHIP error\n");
close(sockfd);
return -1;
}
unsigned int iBufLen = sizeof(char) * MAX_LONG_FRAME;
char *pcMutilRecvBuf = NULL;
pcMutilRecvBuf = (char *)malloc(iBufLen);
int recv_len;
while (1)
{
if (recv_len = recvfrom(sockfd, pcMutilRecvBuf, iBufLen, 0, (sockaddr*)&mcAddr, (socklen_t*)&mcAddrLen)<0)
{
printf("Received Failed!");
return -1;
}
printf("Received %d bytes from %s: ", recv_len,
inet_ntoa(mcAddr.sin_addr));
}
}
ローカルコンピュータカードenp61s0をIP 10.13.1.102、ネットマスク255.255.0.0に設定しました。コードがrecvfrom()関数にハングしてデータを取得できませんでした。
ルーティングプロトコルに224.0.2.2を追加しましたroute add -net 10.13.1.113 netmask 255.255.255.255 enp61s0
。