我一直在研究以前的问题,但到目前为止,他们都没有帮助解决我的问题。
我试图从模拟器接收数据,进行一些解码和编码,然后再发送到另一端的另一个接收器。
目前使用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。
我在某处有误会,或者我的代码有问题,请提供建议。
答案 0 :(得分:0)
sendaddr
应该在代码中的多个位置sendsock
。sizeof stringdata
不会产生它包含的字符串的长度。