我正在用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'字符的二進制文件,導致其被過早切斷?我將如何解決這個問題?謝謝:)
你不應該在一個字符串中存儲二進制數據(儘管你可以)。改爲使用矢量。 –
Alex
2012-08-08 19:34:42
Alex:不,使用'std :: vector'。 –
orlp
2012-08-08 19:37:07
沒關係,除非你打算把字節打印成數字。二進制數據只是二進制數據。 – Alex 2012-08-08 19:38:50