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

Recv not returning enough bytes (binary http response)?

本文关键字:二进制 http 响应 字节 返回 Recv      更新时间:2023-10-16

我正在用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: %dn", iResult);
        response.append(recvBuf, 0, iResult);
    } else if(iResult == 0){
        printf("  - Connection Closedn");
    } else {
        working = false;
        printf("  - Failed: %dn", WSAGetLastError());
        return 1;
    }
} while(iResult > 0);

以下是我在 Visual Studio 中查看"监视"功能时(连接关闭后)响应字符串中的内容:

HTTP/1.1 200 OK 内容类型:文本/纯文本 内容长度:399 d8:completei213e10:downloadedi139e10:incompletei17e8:intervali1970e12:min intervali985e5:peers300:Yšqö*^ýåÈμμcü*—®€Éýò6 ̧ VÉ_0 ºàÉQªUºÉÆ'÷ºÉQñ1/2ÎâV¬ãß3/4Ã,Ië{3/4£é'ÈÕ1/2ÇMÈn1/2ÖQÖ1/411/4K]»k"ÎÅº× Pź|Á¶X1/4ºMä ̧B"‹žÆ²"Œ2œ±ªÈj°4Ìú· ̄«ö'î ̄+r€c ̄‰"r¦Î'Ã7Íœ"5ÄcÿICÈ|'"ø3yÛæÜâõsø¿³©nŸ¤u±ýmÿ‡μmš8äScûÜ8ý–_÷

对等体后面的 300 表示 300: 之后的数据长度应为 300 字节。我把数据放在一个字符计数器中,只有212个字符(字节),这让我相信响应被切断了。它也不以 e 结尾。

这似乎只在涉及二进制数据时才会发生。二进制数据是否可能包含"\0"字符的二进制文件,从而导致其过早被切断?我将如何解决这个问题?谢谢:)

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

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