Linux에서 UDP 멀티캐스트를 사용하면 recvfrom()이 데이터를 얻을 수 없습니다.

Linux에서 UDP 멀티캐스트를 사용하면 recvfrom()이 데이터를 얻을 수 없습니다.

내 임무는 센서 장치에서 데이터를 얻는 것입니다. 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.

관련 정보