1

我正在使用 Visual Studio 2003 编写一个通过 UDP 套接字与本地 LAN 通信的简单程序。而且我试图不使用 MFC。以下是我用来测试 UDP 套接字的一小段代码:

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。奇怪的是,如果dest IP是192.168.1.108这样的本地IP,我无法在wireshark中捕获数据包。但是,如果目标 IP 是 192.168.1.1(网关)或 192.168.1.255(广播)或 LAN ip 外部(如 192.168.2.108),我可以捕获 UDP 数据包。

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

4

1 回答 1

3

如果您将 UDP 数据包发送到您的机器不知道的 IP 地址,它将首先通过ARP 协议询问机器的 MAC 地址。

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

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

于 2012-12-23T13:06:38.957 回答