如何修复失败的多播接收?

时间:2015-10-22 17:09:36

标签: c visual-studio udp multicast

我在Windows XP上使用Visual Studio 6.0 VC ++(是的,我知道它的旧技术) 我有一个通过UDP进行通信的设备所有文档都说多播,而且我在几年前写了一个应用程序并与之通信并使用多播。 我的发送和接收代码将在下面。我的发送工作正常,使用Wireshark我可以看到消息输出格式正确,并看到设备响应格式正确的消息。我无法将其收到我的代码中。它只是设置在那里,无限地倾听,从不接受任何东西。  以下是Wireshark从设备中显示的内容:

源192.168.200.41源端口为6311(设备) 目标端口192.168.200.72目标端口为6303(我的开发PC)

    ////////////////////////////Sender //////////////////////////////////
    //
    //  create a send udp socket descriptor
    // 
        SOCKET sUDPsocket = socket(AF_INET, SOCK_DGRAM, 0);

    //
    //initialize address struct 
    //

    memset(&address_send, 0, sizeof(address_send));
    address_send.sin_family = AF_INET;
    address_send.sin_port = htons(localPort);
    address_send.sin_addr.s_addr = inet_addr("239.255.255.250")

//
//  send the contents of cBuffer
//

    nBytesSent = sendto(sUDPsocket, cBuffer, nBufSize, 0,(SOCKADDR *)                       &address_send,sizeof(SOCKADDR_IN));

/////////////////////////// receiver /////////////////////////////////////////
//
//  create a receive udp socket descriptor 
//
    SOCKET rUDPsocket = socket(AF_INET, SOCK_DGRAM, 0);

/
//  initialize bind address struct 
//
    memset(&address_recv, 0, sizeof(address_recv));
    address_recv.sin_family = AF_INET;
    address_recv.sin_port = htons(6311);
    address_recv.sin_addr.s_addr = htonl(INADDR_ANY);
//
//  bind to this address/port
//
        result = bind(rUDPsocket, (struct sockaddr*)&address_recv,
                 sizeof(address_recv));

//
//  initialize recvfrom address struct
//
    sockaddr sender_address;
    rAddrsize = sizeof(sockaddr);

//
//  receive data
//
    rBytesRecv = recvfrom(rUDPsocket, rBuffer, rBufSize, 0,
                   (SOCKADDR *) &sender_address,
                   &rAddrsize);

/////////////////////////////////////////////////////////////////////////////

1 个答案:

答案 0 :(得分:0)

您的接收器未设置为接收多播流量。您需要使用IP_ADD_MEMBERSHIP套接字选项加入多播组:

struct ip_mreq mreq;
mreq.imr_multiaddr = inet_addr("239.255.255.250");
mreq.imr_interface = inet_addr("192.168.200.72");
if (setsockopt(rUDPsocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           (char *)&mreq, sizeof(mreq)) == -1) {
    char errbuf[300];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(),
                  0, errbuf, sizeof(errbuf), NULL);
    fprintf(stderr, "(%d) %s", WSAGetLastError(), errbuf);
}

另外,请确保您正在侦听正确的端口。如果多播数据包的目标端口为6311,则可以。如果没有,请将其更改为该端口。