gpt4 book ai didi

c++ - 如何正确接收组播UDP包?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:35 25 4
gpt4 key购买 nike

多播网络的新手,我需要通过我的 Windows 机器上的一个 NIC 从多播 channel 接收 UDP 数据包,遵循 Microsoft 文档和一些博客条目,但仍然有问题。

我通过创建套接字

ls = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

打电话。然后设置sockopt为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());
}

如果 socket 是好的

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);

如果绑定(bind)成功

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.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, length 58 ...

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

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

其中 sz 是一个 int,ls 是我的套接字,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 结构中正确指示哪个是用于多播消息的网络接口(interface)。

是我的错。抱歉噪音。

关于c++ - 如何正确接收组播UDP包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com