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 を使用してパケットをキャプチャします。

私の PC の IP は 192.168.1.107 です。奇妙なことに、dest IP が 192.168.1.108 のようなローカル IP の場合、wireshark でパケットをキャプチャできません。しかし、送信先 IP が 192.168.1.1 (ゲートウェイ) または 192.168.1.255 (ブロードキャスト) であるか、192.168.2.108 のような LAN IP の外部にある場合、UDP パケットをキャプチャできます。

誰が私にこれを説明できますか? 私のコードに問題はありますか?

4

1 に答える 1

3

お使いのマシンが認識していない IP アドレスに UDP パケットを送信する場合、マシンは最初にARP プロトコルを介してマシンの MAC アドレスを要求します。

応答があれば、受信した MAC アドレスにパケットを送信します。MAC アドレスに関する応答が得られない場合、UDP パケットはまったく送信されません。

192.168.1.1 は既存のマシン (デフォルト ルーター) であり、LAN の外にあるものはすべてその既存のデフォルト ルーターを通過するため、UDP パケットが送信されていることがわかります。LAN 上に存在しない IP に送信しようとすると、パケットが送信される前に ARP が失敗するため、送信されたパケットは表示されません。

于 2012-12-23T13:06:38.957 に答える