gpt4 book ai didi

c++ - recvfrom 只捕获发送到 255.255.255.255 的数据包

转载 作者:行者123 更新时间:2023-11-28 08:04:54 26 4
gpt4 key购买 nike

我正在与这个奇怪的问题作斗争,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;
}

最佳答案

好吧,我花了几天时间才弄明白,但我终于修好了。

问题实际上是我尝试接收的数据包不是发给我的。让我详细说明。在 bootp 协议(protocol)中,您向您发送 MAC 地址,服务器使用广播或与 MAC 地址连接的 IP 发送回复。问题是我使用了另一台计算机的 MAC 地址,所以回复是针对那台计算机而不是我。

就是这样——如果您没有收到任何东西,请确保您是目的地。

关于c++ - recvfrom 只捕获发送到 255.255.255.255 的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465240/

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