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

时间:2012-12-23 12:51:19

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

我正在使用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(广播),或者在局域网IP之外,如192.168.2.108,我可以捕获UDP数据包。

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

1 个答案:

答案 0 :(得分:3)

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

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

192.168.1.1是现有计算机(默认路由器),LAN外的所有内容都将通过现有的默认路由器,因此您将看到传输的UDP数据包。如果您尝试发送到LAN上的非现有IP,则在发送数据包之前ARP将无法发送任何数据包。