UDP多播发送

时间:2017-05-16 02:50:51

标签: c++ udp

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

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

目前使用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 multicast的概念,是客户端或服务器加入udp组播组发送或接收数据,而IP使用239.254.4.27加入组,因此{ {1}}。

我必须使用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

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

我在某处有误会,或者我的代码有问题,请提供建议。

1 个答案:

答案 0 :(得分:0)

  • INADDR_ANY不是目标IP地址,也不是组播组地址,这是您应该发送的地址。
  • 您不需要加入小组发送给它。
  • sendaddr应该在代码中的多个位置sendsock
  • sizeof stringdata不会产生它包含的字符串的长度。