2011-12-16 76 views
1

我遇到了一些問題,recvfrom()沒有得到所有的數據包在C++中。 (然後阻止並不返回)recvfrom()沒有得到所有東西

我發送1個查詢包,然後發送響應。
它被分成多個805字節的數據包,然後以〜200字節的數據包結束。
從我的測試中,共收到54個數據包。

然而,我的程序總共只收到25-35個數據包,而不是結束數據包,儘管數據包似乎在WireShark中正常到達。

我的代碼可以在這裏看到:

sockaddr_in local, dest; 
local.sin_family = AF_INET; 
local.sin_port = htons(58770); 
local.sin_addr.S_un.S_addr = INADDR_ANY; 

dest.sin_family = AF_INET; 
dest.sin_addr.S_un.S_addr = inet_addr(QUERYADDR); 
dest.sin_port = htons(20810); 

SOCKET s; 
if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 
    errex("socket() failed"); 

if(bind(s, (sockaddr*)&local, sizeof(local)) == -1) 
    errex("bind() failed!"); 

sendto(s, (const char*)QUERY, sizeof(QUERY), 0, (sockaddr*)&dest, sizeof(dest)); 

while(true) 
{ 
    sockaddr_in tsaddr; 
    char buf[8192]; 

    int slcl = sizeof(tsaddr); 
    int res = recvfrom(s, buf, sizeof(buf), 0, (sockaddr*)&tsaddr, &slcl); 
    printf("%i\n", res); 
} 

closesocket(s); 
WSACleanup(); 

有人能看到什麼錯?

+3

這讓我想起曾經聽過的UDP笑話,但我從來沒有聽說過。 – 2011-12-16 20:06:47

+0

當您使用TCP而不是UDP時,它看起來如何? – stacker 2011-12-16 20:26:16

回答

0

最可能的解釋是數據包被丟棄在某處沿線。 Wireshark只是告訴你,數據包在網絡上,而不是它們被接收器正確接收。

嘗試在接收器上檢查您的SO_RCVBUF插口選項以確保不會超出範圍(這將導致丟包),並檢查網絡驅動程序是否有任何錯誤或其他問題。