2012-12-23 52 views
1

我正在使用visual studio 2003通過UDP套接字編寫一個簡單的與本地局域網的通信程序。我試圖不使用MFC。以下是一小片的代碼我用來測試UDP套接字:奇怪發送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數據包。

誰能爲我解釋這個?我的代碼有問題嗎?

+0

不能幫你,但我可以說,我有與wireshark相同的問題。發送了UDP數據包,我在局域網中的本地服務器上收到它,但無法用Wireshark記錄該數據包。 – 2012-12-23 13:15:36

回答

3

如果您要將UDP數據包發送到本機未知的IP地址,它將首先通過ARP protocol要求機器的MAC地址。

如果得到響應,它會將您的數據包發送到它接收到的MAC地址,如果它無法獲得有關MAC地址的響應,則根本不會發送UDP數據包。

192.168.1.1是一臺現有的機器(默認路由器),局域網以外的所有設備都將通過現有的默認路由器,因此您將看到您的UDP數據包傳輸。如果您嘗試發送到LAN上的非現有IP,您將看不到任何發送的數據包,因爲在數據包被髮送之前,ARP將失敗。

+0

我刪除了udp的過濾器,然後我看到了ARP數據包。謝謝。 – TieDad