我目前正在开发一个使用主循环来绘制物品的游戏。在进入主循环之前,我创建了一个线程,使用低级数据包接收器函数来接收数据包。然而,当我运行代码时,我注意到我的程序接收到带有随机IP地址的奇怪数据包,如“237.0.0.0“、“45.0.0.0“和“185.0.0.0“。每次我重新启动程序时,这些IP地址都会更改。
下面是数据包接收器函数的代码:
//thread creation in main function:
this->receive_thead = std::thread(&OGame::packet_receiver, this);
void OGame::packet_receiver() {
while (1) {
std::lock_guard<std::mutex> lock(packet_mutex);
Packet rec = this->network.Receive();
if (rec.type == -1)
continue;
printf("Received actual packet!\n");
}
}
Packet AgiborNet::Receive()
{
Packet packet{ 0 };
char rec_buffer[sizeof(packet) + 13];
struct sockaddr_in sender_addr;
int sender_addr_size = sizeof(sender_addr);
int recv_size = recvfrom(this->receive_socket, rec_buffer, sizeof(rec_buffer), 0, (struct sockaddr*)&sender_addr, &sender_addr_size);
if (sender_addr.sin_addr.s_addr == this->send_ip.sin_addr.s_addr) {
Packet empty_packet = { 0 };
empty_packet.type = -1;
return empty_packet;
}
std::cout << inet_ntoa(sender_addr.sin_addr) << ": " << rec_buffer << std::endl;
std::cout << "Packet contents: ";
for (int i = 0; i < recv_size; i++) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(rec_buffer[i]) << " ";
}
std::cout << std::dec << std::endl;
return packet;
}
我还注意到Wireshark没有检测到这些数据包。另外,当我发送至少一个数据包时,我的程序停止接收这些奇怪的数据包。对于上下文,我正在侦听和等待特定端口上的广播数据包。
有人能帮我理解为什么我的程序会接收到这些带有随机IP地址的奇怪数据包,为什么Wireshark没有检测到它们吗?谢谢。
1条答案
按热度按时间5uzkadbs1#
正如你们中的一些人在评论中所说的,问题是我没有检查recvfrom的返回值。