Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recv没有返回足够的字节(二进制http响应)? 我正在用C++编写一个BitTorrent客户端。当我的程序使用.torrent文件中提供的信息与跟踪器联系时,它有时无法返回足够的字节。根据bittorrent协议规范()的定义,响应应该是一个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);_C++_Bittorrent - Fatal编程技术网

Recv没有返回足够的字节(二进制http响应)? 我正在用C++编写一个BitTorrent客户端。当我的程序使用.torrent文件中提供的信息与跟踪器联系时,它有时无法返回足够的字节。根据bittorrent协议规范()的定义,响应应该是一个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);

Recv没有返回足够的字节(二进制http响应)? 我正在用C++编写一个BitTorrent客户端。当我的程序使用.torrent文件中提供的信息与跟踪器联系时,它有时无法返回足够的字节。根据bittorrent协议规范()的定义,响应应该是一个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);,c++,bittorrent,C++,Bittorrent,下面是我在Visual Studio中查看Watch功能时(连接关闭后)响应字符串中的内容: HTTP/1.1200ok 内容类型:文本/纯文本 内容长度:399 d8:Complete213E10:downloadedi139e10:IncompletiI17E8:Intervalid1970E12:MinIntervalid985E5:peers300:Yšqöcücý6:VýUýqýUýUýUýcýcýcý6ýUýUýUýUýUýUýUýýýýý6ýUýUýUýUýUýUýu253 Pèè

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

HTTP/1.1200ok 内容类型:文本/纯文本 内容长度:399 d8:Complete213E10:downloadedi139e10:IncompletiI17E8:Intervalid1970E12:MinIntervalid985E5:peers300:Yšqöcücý6:VýUýqýUýUýUýcýcýcý6ýUýUýUýUýUýUýUýýýýý6ýUýUýUýUýUýUýu253 Pèèèèèèèèèèèèèèèèèèèèèèèèèèèè+rècèèè

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


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

可能只是打印问题:检查实际字符串
长度()
并打印字符串的
数据()
手动(即使用循环)正如你所说的,VisualStudio完全有可能在遇到第一个<代码> 0个/代码>时,在显示列表中停止显示字符串。

< P>它可以简单地是调试器显示字符串直到第一个空字符。

不应将二进制数据存储在字符串中(尽管可以).改用vector。Alex:不,使用
std::vector
。没关系,除非你要将字节打印为数字。二进制数据只是二进制数据。@Alex你不想让一个负数
char
意外地将符号扩展为
int
。如何处理二进制数据取决于它的格式。如果你要做使用单个字节进行算术运算,然后您可能应该将它们视为无符号字符,这样存储它们很方便。但是您可能需要将它们视为-127+128范围内的有符号整数。通常,您要么将数据强制转换为某个
结构,要么将其传递给某个有意义的外部函数r方式,只要在使用时正确对待,存储方式并不重要。这似乎是最有可能的选择。在看到您的答案后,我在visual studio中又运行了一些测试。recv告诉我它已检索到466字节的数据,我检查了有多少个字符(字节)visual studio向我展示的是207。这应该是我之前检查过的内容之一:)谢谢