UDP 组播发送

UDP Multicast sending

本文关键字:UDP      更新时间:2023-10-16

我一直在看以前的问题,但到目前为止,它们都没有帮助解决我的问题。

我正在尝试从模拟器接收数据,进行一些解码和编码,然后将其发送到另一端的另一个接收器。

目前使用UDP组播,我的接收器函数工作正常,部分代码是:

int multicast = 1;
SOCKET recvsock;
sockaddr_in recvaddr;
struct ip_mreq mreq;
memset(&recvaddr, 0, sizeof(recvaddr);
memset(&mreq, 0, sizeof(mreq);
recvaddr.sin_family = AF_INET;
recvaddr.sin_addr = htonl(INADDR_ANY);
recvaddr.sin_port = htons(8807);
mreq.imr_interface.s_addr = INADDR_ANY;
mreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27");
setsockopt(recvsock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
setsockopt(recvsock, SOL_SOCKET, SO_REUSEADDR, (char*)&multicast, sizeof(multicast));
bind(recvsock, (SOCKADDR*)&recvaddr, sizeof(recvaddr));

上述套接字设置和套接字选项适用于接收。我已经删除了SOCKET_ERROR的检查以减少我问题的长度,我将其放在我当前的代码中用于检查目的。

据我了解,udp组播的概念,是让客户端或服务器加入udp组播组来发送或接收数据,而使用的IP239.254.4.27到组加入,因此这个mreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27")

我必须使用SO_REUSEADDR因为我必须多次绑定相同的端口号,我相信模拟器也在绑定端口,因为如果我不使用它,我会遇到错误10048

但是,当我对发送函数做同样的事情时,下面的代码:

SOCKET sendsock;
sockaddr_in sendaddr;
memset(&rsendaddr, 0, sizeof(sendaddr);
memset(&mreq, 0, sizeof(mreq);
sendaddr.sin_family = AF_INET;
sendaddr.sin_addr = htonl(INADDR_ANY);
sendaddr.sin_port = htons(8807);
mreq.imr_interface.s_addr = INADDR_ANY;
mreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27");
setsockopt(sendaddr, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
setsockopt(sendaddr, IOL_SOCKET, SO_REUSEADDR, (char*)&multicast, sizeof(multicast));
bind(sendaddr, (SOCKADDR*)&sendaddr, sizeof(sendaddr));

绑定返回成功,但是当我这样做时:

int send_data = sendto (sendsock, stringdata.c_str(), sizeof(stringdata), 0,(struct sockaddr*)&sendaddr, sizeof(sendaddr));

我有一个错误10049,这是WSAEADDRNOTAVAIL,这意味着Cannot assign requested address

编辑:我目前正在使用Microsoft环回适配器,我是否还必须包括环回适配器的IP。

我是否在某处有误解,或者我的代码有问题,请告知。

  • INADDR_ANY不是目标 IP 地址,也不是您应该发送到的组播组地址。
  • 您无需加入群组即可向其发送邮件。
  • sendaddr应该在代码中的多个位置sendsock
  • sizeof stringdata不会产生它所包含的字符串的长度。
相关文章:
  • 没有找到相关文章