c++ - 将udp数据包发送到本地局域网很奇怪

标签 c++ c udp visual-studio-2003 visual-c++

我正在使用 visual studio 2003 编写一个简单的程序,通过 UDP 套接字与本地 LAN 进行通信。我正在尝试不使用 MFC。下面是我用来测试UDP socket的一小段代码:

static void sendMsg(char *buf, int len)
{
SOCKET sock;
struct sockaddr_in addr;

sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
    return;

addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr("192.168.2.108"); // Specify dest IP

sendto(sock, buf, len, 0, (struct sockaddr*)&addr, sizeof(addr));

closesocket(sock);
}

为了验证数据包是否发送出去,我使用wireshark抓包。

我电脑的 IP 是 192.168.1.107。奇怪的是,如果目标IP是192.168.1.108之类的本地IP,我无法在wireshark中抓包。但如果目标 IP 是 192.168.1.1(网关)或 192.168.1.255(广播)或 LAN 外部 IP,如 192.168.2.108,我可以捕获 UDP 数据包。

谁能给我解释一下?我的代码有什么问题吗?

最佳答案

如果您将 UDP 数据包发送到您的机器不知道的 IP 地址,它将首先通过 ARP protocol 请求机器的 MAC 地址。 .

如果它得到响应,它会将您的数据包发送到它收到的 MAC 地址,如果它无法获得有关 MAC 地址的响应,则根本不会发送 UDP 数据包。

192.168.1.1 是一台现有机器(默认路由器),您 LAN 之外的所有内容都将通过该现有默认路由器,因此您将看到您的 UDP 数据包被传输。如果您尝试发送到 LAN 上不存在的 IP,您将看不到任何发送的数据包,因为 ARP 会在您的数据包传输之前失败。

关于c++ - 将udp数据包发送到本地局域网很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011088/

相关文章:

c++:如何找到哪个标准库包含丢失的外部符号?

c++ - 将 32 位 C++ 库重新编译为 64 位

为集合创建动态数组

python - Python中无法接收UDP数据包

audio - GStreamer通过UDP流音频和视频,以便能够在VLC上播放

c++ - DDD 的运行时错误

c++ - Sprite 不会在 SFML 中移动

c - 我如何打印一位?

c - 静态字段 - 初始化和更改值

networking - 为什么 DNS 请求中句点的十六进制值不是 0x2E,为什么会发生变化?