如何正确接收多播UDP数据包

How to receive multicast UDP packets correctly?

本文关键字:UDP 数据包 多播 何正确      更新时间:2023-10-16

我是多播网络的新手,我需要通过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,网络管理员告诉我必须使用第三个,假设它有a.b.c.dIPv4地址

他们还告诉我,mcast IP是e.f.g.h

如果我在我的windows框上运行windump.exe-I 3,我会看到类似于的东西

。。。12:53:58.454887 IP i.k.l.m.xxxxx>e.f.g.h.myport:UDP,长度58…

初始化UDP套接字后,我从调用recvf

sz = recvfrom(ls, buffer, DATA_BLOCK_SIZE, 0, reinterpret_cast<SOCKADDR*>(&client), &size);

其中sz是int,ls是my套接字,buffer是"合适的缓冲区",DATA_BLOCK_SIZE是缓冲区大小,client是从发送方接收信息的SOCKADDR指针,SIZE是接收到的消息大小。

我的代码卡在recvfrom调用中,从来没有收到任何东西。

我显然在某个地方犯了一个错误,但不明白在哪里,更糟糕的是为什么。

如果有人能向我解释正在发生的事情,我将不胜感激。

已解决。。。

我只更改了

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中正确指示用于多播消息的网络接口。

这是我的错。抱歉有噪音。