recvfrom 仅捕获发送到 255.255.255.255 的数据包
recvfrom catches only packets sent to 255.255.255.255
我正在与这个奇怪的问题作斗争,其中 recvfrom 仅在捕获目标地址为 255.255.255.255 的广播数据包时才返回。直接寻址到客户端(即使用客户端 IP(的数据包将被忽略。
现在一些背景(你可以跳过它,这只是为了澄清我想要做什么(——我正在尝试实现一个简单的 BOOTP 客户端。我能够创建一个 BOOTREQUEST,服务器使用正确的 BOOTREPLY 回复它(使用 wireshark 和我使用 libpcap 编写的简单分析器进行检查(。但是,即使我在wireshark中看到回复,我也无法在客户端中接收它,因为它使用客户端的IP地址作为目标。
我正在一个网络上尝试这个,我也可以从其他计算机捕获 BOOTP 数据包。我发现 recvfrom 可以接收带有广播地址的 BOOTREPLY 数据包。不好的是这些不是我的,因为我允许服务器使用单播进行回复。
我使用的代码:
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0) {
std::cerr << "Cannot create socket" << std::endl;
return;
}
int broadcastON = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcastON, sizeof(broadcastON));
sockaddr_in recv_address;
memset((char *) &recv_address, 0, sizeof(recv_address));
recv_address.sin_family = AF_INET;
recv_address.sin_port = htons(68);
recv_address.sin_addr.s_addr = htonl(INADDR_ANY);
int recv_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (recv_sockfd < 0)
{
std::cerr << "Cannot create socket" << std::endl;
return;
}
if (bind(recv_sockfd, (sockaddr *) &recv_address, sizeof(recv_address)) < 0)
{
std::cerr << "Cannot bind socket" << std::endl;
perror("bind");
return;
}
sniff_bootp packet = createBootpPacket(mac);
sockaddr_in server_address;
memset((char *) &server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(67);
server_address.sin_addr.s_addr = htonl(INADDR_BROADCAST);
if (sendto(sockfd, &packet, sizeof(packet),0,(sockaddr *) &server_address, sizeof(server_address)) < 0)
{
perror("sendto");
return;
}
char msg[512];
while(1)
{
sockaddr_in source_address;
unsigned int cli_addr_len = sizeof(source_address);
// HERE IS THE PROBLEM
// returns only if the destination is broadcast
int msg_length = recvfrom(recv_sockfd, msg, 512, 0, (sockaddr *) &source_address, &cli_addr_len);
if (msg_length < 0) {
perror("rcvfrom");
continue;
}
好吧,我花了几天时间才弄清楚这个问题,但我终于修复了它。
问题实际上是我试图接收的数据包不是为我准备的。让我详细说明一下。在引导协议中,您发送 MAC 地址,服务器使用广播或与 MAC 地址连接的 IP 发送回复。问题是我使用了另一台计算机的MAC地址,因此回复是发送给该计算机而不是我。
就是这样 - 如果您没有收到任何东西,请确保您是目的地。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- 通过RecvFrom(UDP)接收数据包的一部分
- recvfrom 仅捕获发送到 255.255.255.255 的数据包