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の監視機能を確認すると(接続が閉じられた後)、応答文字列は次のようになります。

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」文字のバイナリが含まれているために、途中で切り捨てられた可能性はありますか?どうすれば修正できますか?ありがとうございました :)

4

2 に答える 2

3

デバッガーが最初のヌル文字まで文字列を表示するだけの可能性があります。vector<unsigned char>ここでは生のバイトを扱っているので、代わりに使用することを検討できます。

于 2012-08-08T19:38:09.643 に答える
0

おそらくそれは単なる印刷の問題です。実際の文字列を確認し、文字列を手動で(つまりループを使用して)length()印刷します。data()あなたが言ったように、VisualStudioが最初の文字列に\0遭遇するとすぐにウォッチリストに文字列を表示しなくなる可能性があります。

于 2012-08-08T19:37:04.197 に答える