странно насчёт отправки пакета udp на локальную локальную сеть

Я использую 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.

Кто может объяснить это для меня? Что-то не так с моим кодом?

1

Решение

Если вы отправляете пакет UDP на IP-адрес, который не известен вашей машине, он сначала запросит MAC-адрес машины через Протокол ARP.

Если он получает ответ, он отправляет ваш пакет на MAC-адрес, который он получает, если он не может получить ответ о MAC-адресе, пакет UDP вообще не будет отправлен.

192.168.1.1 — это существующий компьютер (маршрутизатор по умолчанию), и все, что находится за пределами вашей локальной сети, будет проходить через этот существующий маршрутизатор по умолчанию, поэтому вы увидите, что ваши UDP-пакеты переданы. Если вы попытаетесь отправить на несуществующий IP-адрес в вашей локальной сети, вы не увидите ни одного отправленного пакета, поскольку ARP завершится сбоем еще до того, как ваш пакет будет передан.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]