如何正确接收组播UDP报文?

时间:2019-01-04 12:10:47

标签: c++

对于多播网络来说是新手,我需要通过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调用中,什么也没收到。

我显然在某处犯了一个错误,但不了解在哪里以及更糟的原因。

如果有人可以解释我的情况,将不胜感激。

1 个答案:

答案 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中正确指出哪个是用于多播消息的网络接口。

这是我的错。很抱歉听到声音。