对于多播网络来说是新手,我需要通过Windows框上的NIC之一从多播通道接收UDP数据包,之后是Microsoft文档和一些博客条目,但是仍然有问题。
我通过创建一个套接字
ls = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
打电话。 然后将ockopt设置为SO_REUSEADDR
unsigned int reuse = 1;
if( setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0 )
{
LOG4CXX_ERROR(logger, "Reusing ADDR failed. Err: " << WSAGetLastError());
}
如果套接字正确
int result = bind(ls, reinterpret_cast<SOCKADDR*>(&server), sizeof(server));
其中
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(myport);
如果绑定成功
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("e.f.g.h");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if( setsockopt(ls, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0 )
{
LOG4CXX_ERROR(logger, "setsockopt multicast group add membership failed. Err: " << WSAGetLastError());
}
我需要在其中接收数据包的盒子上有四个NIC,网络管理员告诉我我必须使用第三个NIC,比如说它具有 a.b.c.d IPv4地址
他们还告诉我,mcast IP是 e.f.g.h
如果我在Windows框中运行 windump.exe -i 3 ,我会看到类似的内容
... 12:53:58.454987 IP i.k.l.m.xxxxx> e.f.g.h.myport:UDP,长度58 ...
初始化UDP套接字后,我调用recvfrom
sz = recvfrom(ls, buffer, DATA_BLOCK_SIZE, 0, reinterpret_cast<SOCKADDR*>(&client), &size);
其中sz是一个int,ls是我的套接字,buffer是一个“合适的缓冲区”,DATA_BLOCK_SIZE是缓冲区大小,客户端是一个SOCKADDR指针,用于接收来自发送者的信息,而size是接收到的消息大小。
我的代码卡在recvfrom调用中,什么也没收到。
我显然在某处犯了一个错误,但不了解在哪里以及更糟的原因。
如果有人可以解释我的情况,将不胜感激。
答案 0 :(得分:0)
已解决...
我只更改了这些行
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("e.f.g.h");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
到
struct ip_mreq mreq;
inet_pton(AF_INET, "e.f.g.h", &(mreq.imr_multiaddr));
inet_pton(AF_INET, "a.b.c.d", &(mreq.imr_interface));
我猜想我没有在结构ip_mreq中正确指出哪个是用于多播消息的网络接口。
这是我的错。很抱歉听到声音。