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
不会产生它所包含的字符串的长度。
相关文章:
- 没有找到相关文章