Recv没有返回足够的字节(二进制http响应)?

时间:2012-08-08 19:29:15

标签: c++ bittorrent

我正在用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'字符的二进制数,导致它过早被切断?我该如何解决这个问题?谢谢:))

2 个答案:

答案 0 :(得分:3)

可能只是调试器显示字符串直到第一个空字符。您可以考虑使用vector<unsigned char>,因为您在这里处理原始字节。

答案 1 :(得分:0)

可能只是打印问题:检查实际字符串length()并手动打印字符串data()(即循环)。正如您所说,只要遇到第一个\0,Visual Studio就完全有可能停止在监视列表中显示字符串。