如何正确接收多播UDP数据包
How to receive multicast UDP packets correctly?
我是多播网络的新手,我需要通过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中正确指示用于多播消息的网络接口。
这是我的错。抱歉有噪音。
相关文章:
- 发送固定大小的 UDP 数据包
- 使用C++将UDP数据包存储在Structure中
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- Qt 在可预测的秒数后跳过 UDP 数据包
- 高频接收UDP数据包:丢包?
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- 获取进入UDP数据包的目标端口
- 操纵Windows Explorer窗口时,UDP数据包会掉落
- C++ 使用 recvmmsg 丢弃 UDP 数据包
- 如何在QT中接收适当的UDP数据包
- 使用ASIO捕获大量UDP数据包
- 如何正确接收多播UDP数据包
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 如何检查UDP数据包是否在发送器上发送
- 使用 QNX 实时操作系统实时接收 UDP 数据包
- 高效地发送UDP数据包流
- 为什么我在使用 winsock 时没有收到 UDP 数据包?
- SDL_net UDP 数据包数据