1

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

4

2 回答 2

3

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

于 2012-08-08T19:38:09.643 回答
0

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

于 2012-08-08T19:37:04.197 回答