Я использую Visual Studio 2003, чтобы написать простую программу связи с локальной сетью через сокет UDP. И я пытаюсь не использовать 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 является локальным IP, таким как 192.168.1.108, я не могу перехватить пакет в wireshark. Но если IP-адрес dest 192.168.1.1 (шлюз) или 192.168.1.255 (широковещательный) или вне IP-адреса локальной сети, например 192.168.2.108, я могу перехватить пакет UDP.
Кто может объяснить это для меня? Что-то не так с моим кодом?
Если вы отправляете пакет UDP на IP-адрес, который не известен вашей машине, он сначала запросит MAC-адрес машины через Протокол ARP.
Если он получает ответ, он отправляет ваш пакет на MAC-адрес, который он получает, если он не может получить ответ о MAC-адресе, пакет UDP вообще не будет отправлен.
192.168.1.1 — это существующий компьютер (маршрутизатор по умолчанию), и все, что находится за пределами вашей локальной сети, будет проходить через этот существующий маршрутизатор по умолчанию, поэтому вы увидите, что ваши UDP-пакеты переданы. Если вы попытаетесь отправить на несуществующий IP-адрес в вашей локальной сети, вы не увидите ни одного отправленного пакета, поскольку ARP завершится сбоем еще до того, как ваш пакет будет передан.
Других решений пока нет …