我正在用 C++ 编写一个 bittorrent 客户端。当我的程序使用 .torrent 文件中提供的信息联系跟踪器时,它有时不会发回足够的字节。根据 bittorrent 协议规范 ( http://wiki.theory.org/BitTorrentSpecification#Tracker_Response )定义的响应应该是一个经过编码的字典,这意味着它应该以“d”开头并以“e”结尾。这是我用来接收和存储跟踪器响应的代码:
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 中查看 Watch 功能时响应字符串中的内容(在连接关闭后):
HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 399 d8:completei213e10:downloadedi139e10:incompletei17e8:intervali1970e12:min intervali985e5:peers300:Yšqö*^ýÈȵµcü*—®€Éýò6¸VÉ_0ºàÉQ¸UºÉ¬Æ'÷ÃQÉQ¸UºÉ¬ã÷ÃQÉ ,Ië{¾£é´ÈÕ½ÇMÈn½ÖQÖ¼1¼K]»k„ÎÅº× Pź|Á¶X¼ºMä¸B"‹žÆ²"Œ2–±ªÈj°4Ìú·¯«ö'î¯+r€c¯‰"r¦Î´Ã7Íœ" 5ÄcÿICÈ|´"”ø3yÛæÜâÕsø¿³©nŸ¤u±ýmÿ‡µmš8äScûÜ8ý–_÷
peers 后面的 300 表示 300: 后面的数据应该是 300 字节长。我将数据放在字符计数器中,只有 212 个字符(字节),这让我相信响应被切断了。它也不以 e 结尾。
这似乎只在涉及二进制数据时发生。二进制数据是否可能包含 '\0' 字符的二进制文件,导致它被过早地切断?我将如何解决这个问题?谢谢 :)