我正在用C ++编写一个bittorrent客户端。当我的程序使用.torrent文件中提供的信息联系跟踪器时,它有时不会发回足够的字节。由bittorrent协议规范(http://wiki.theory.org/BitTorrentSpecification#Tracker_Response)定义的响应应该是一个bencoded字典,这意味着它应该以'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好的 Content-Type:text / plain 内容长度:399 d8:completei213e10:downloadedi139e10:incompletei17e8:intervali1970e12:min intervali985e5:peers300:Yšqö* ^ååμμμcü*-®€Éýò6¸VÉ_0ºàÉQªUºÉÆ'÷ºÉQñ½ÎâV¬ãß¾Ã,Ië{¾£é'ÈÕ½ÇMÈn½ÖQÖ¼1¼K]»k“ÎÅº× Pź|Á¶X¼ºMä¸B“<žÆ²”Œ2œ±ªÈj°4IU·¯«ö'î¯+ R€ç‰‘r|Î'Ã7Íœ ”5ÄcÿICÈ|'“’ø3yÛæÜâÕsø¿³©nŸ¤u±ýmÿ ‡μmš8äScûÜ8ý-_÷
300个对等体意味着300之后的数据应该是300个字节长。我把数据放在一个字符计数器中,只有212个字符(字节)让我相信响应被切断了。它也不会以e。
结尾只有在涉及二进制数据时才会发生这种情况。二进制数据是否可能包含'\ 0'字符的二进制数,导致它过早被切断?我该如何解决这个问题?谢谢:))
答案 0 :(得分:3)
可能只是调试器显示字符串直到第一个空字符。您可以考虑使用vector<unsigned char>
,因为您在这里处理原始字节。
答案 1 :(得分:0)
可能只是打印问题:检查实际字符串length()
并手动打印字符串data()
(即循环)。正如您所说,只要遇到第一个\0
,Visual Studio就完全有可能停止在监视列表中显示字符串。