2012-08-08 60 views
1

我正在用C++編寫一個bittorrent客戶端。當我的程序使用.torrent文件中提供的信息聯繫跟蹤器時,它有時不會發送足夠的字節。由Bittorrent協議規範(http://wiki.theory.org/BitTorrentSpecification#Tracker_Response)定義的響應應該是一個帶有空格的字典,這意味着它應該以'd'開頭並以'e'結尾。下面是我使用的接收和存儲跟蹤響應代碼:Recv沒有返回足夠的字節(二進制http響應)?

int iResult; 
char recvBuf[512]; 
int recvBuflen = 512; 
string response; 

//Receive response from tracker 
do{ 
    iResult = recv(ConnectSocket, recvBuf, recvBuflen, 0); 
    if(iResult > 0){ 
     printf(" - Bytes Received: %d\n", iResult); 
     response.append(recvBuf, 0, iResult); 
    } else if(iResult == 0){ 
     printf(" - Connection Closed\n"); 
    } else { 
     working = false; 
     printf(" - Failed: %d\n", WSAGetLastError()); 
     return 1; 
    } 
} while(iResult > 0); 

,這裏是什麼是在響應字符串,當我看着在Visual Studio中的監視功能(連接後已關閉):

HTTP/1.1 200 OK 內容類型:文本/無格式 的Content-Length:399 D8:completei213e10:downloadedi139e10:incompletei17e8:intervali1970e12:分鐘intervali985e5:peers300:Yšqö* ^ýåÈμμcü*-®€Éýò6 ¸VÉ_0ºàÉQªU'ÉÆ'÷ºÉQñ½ÎVâãß¾Ã,Ië{¾'éÕ½ÇMÈn½ÖQÖ¼¹¼K]»k「Îº× Pź|Á¶X¼ºMä¸B「<žÆ²」œ2œªÈj°4Ìú«ö'î¯+ r'c¯'‰'rÎÎÃ7Íœ「5ÄÿICÈ|'」「ø3yÛæÜâsøø¿³©næ¤u± ýmÿ‡μmš8äScûÜ8ý-_÷

對等體之後的300表示300之後的數據:應該是300字節長。我把數據放在字符計數器中,只有212個字符(字節),這使我相信響應被切斷了。它也不會以e結尾。

這隻有在涉及二進制數據時纔會發生。是否有可能二進制數據包含'\ 0'字符的二進制文件,導致其被過早切斷?我將如何解決這個問題?謝謝:)

+0

你不應該在一個字符串中存儲二進制數據(儘管你可以)。改爲使用矢量。 – Alex 2012-08-08 19:34:42

+0

Alex:不,使用'std :: vector '。 – orlp 2012-08-08 19:37:07

+0

沒關係,除非你打算把字節打印成數字。二進制數據只是二進制數據。 – Alex 2012-08-08 19:38:50

回答

3

它可能只是調試器顯示字符串,直到達到第一個空字符。您可以考慮使用vector<unsigned char>,因爲您正在處理原始字節。

+0

這似乎是最可能的選擇。看到你的答案後,我在Visual Studio中進行了一些更多的測試。 recv告訴我它已經檢索了466字節的數據,並且我檢查了視覺工作室向我展示了多少個字符(字節),它是207.這應該是我早些時候檢查的東西之一:)謝謝 – brnby 2012-08-08 21:27:30

0

也許這只是一個打印問題:檢查實際字符串length()並手動打印字符串的data()(即使用循環)。正如您所說的,只要遇到第一個\0,Visual Studio完全有可能停止在監視列表中顯示該字符串。