私は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の監視機能を確認すると(接続が閉じられた後)、応答文字列は次のようになります。
HTTP / 1.1 200 OKコンテンツタイプ:テキスト/プレーンコンテンツ長:399 d8:completei213e10:downloadedi139e10:incompletei17e8:intervali1970e12:minintervali985e5:peers300:Yšqö* ^ýåȵµcü * —®€Éýò6¸VÉ_0ºàÉQªUºÉ 、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ý–_÷
300アフターピアは、300:に続くデータの長さが300バイトであることを意味します。データを文字カウンターに入れましたが、212文字(バイト)しかなかったので、応答が途切れたと思いました。また、eで終わらない。
これは、バイナリデータが関係している場合にのみ発生するようです。バイナリデータに「\0」文字のバイナリが含まれているために、途中で切り捨てられた可能性はありますか?どうすれば修正できますか?ありがとうございました :)