繁体   English   中英

如何解决多播接收失败的问题?

[英]how do I fix failing multicast receive?

我在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);

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

您的接收器未设置为接收多播流量。 您需要使用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,则可以。 如果不是,请将其更改为该端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM