gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:09:27 25 4
gpt4 key购买 nike

我在 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,则没问题。如果没有,请将其更改为该端口。

关于c - 如何修复失败的多播接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com