0

いくつかの6バイトの文字列を含むトラッカー(サーバー)からメッセージを受信するC++でビットトレントクライアントを書いています。最初の4バイトはピアのIPアドレスを表し、次の2バイトはピアがリッスンしているポート番号を表します。

私はipバイトを人間が読めるIPアドレスに変換する方法を考え出しましたが、ポート番号を表す2バイトをint(または同様のもの)に変換するのに苦労しています

これまでの私の取り組みは次のとおりです。

BYTE portbinary[2];
unsigned short peerport;

//trackers[i]->peersBinary[j * 6 + 4] is the first byte
portbinary[0] = trackers[i]->peersBinary[j * 6 + 4];
//trackers[i]->peersBinary[j * 6 + 5] is the second byte
portbinary[1] = trackers[i]->peersBinary[j * 6 + 5];
peerport = *portbinary;

調べてみると、ピアポートには最初のバイトの整数表現しか含まれていないようですが、これを修正するにはどうすればよいですか?

前もって感謝します :)

4

4 に答える 4

3

型のパンニングの代わりにビット単位の演算を使用することを好みます。これは、エンディアンの問題がまったく発生しないためです(ポート番号はビッグエンディアン番号であり、今日の多くのシステムはリトルエンディアンです)。

int peerport = (portbinary[0] << 8) | portbinary[1];
于 2012-08-09T18:28:22.340 に答える
1

portbinaryはの配列なのでBYTE、はと*portbinary同等portbinary[0]です。

結果を達成するためのポータブルな方法は次のとおりです。

peerport = portbinary[0];
peerport = 256*peerport + portbinary[1];

portbinaryこれは、ネットワークバイトオーダーで配信されたことを前提としています。

于 2012-08-09T18:26:49.593 に答える
1

データが整列しているように見えるので、

peerport = ntohs(*(uint16_t *)(trackers[i]->peersBinary + j * 6 + 4));
于 2012-08-09T18:23:38.750 に答える
-1

組合による解決策:

union port_extractor
{
    BYTE raw_port[2];
    unsigned short port_assembled;
};

これは、コンピューターのエンディアンがネットワークからフェッチする表現と同じである場合に機能します。申し訳ありませんが、それがビットトレントプロトコルによってどのようにもたらされるのかわかりません。

エンディアンが反対の場合、使用する必要のあるソリューションはそれほど優れていません。

unsigned short port_assembled = (unsigned short)raw_port[first_byte] | ((unsigned short)raw_port[second_byte] << 8);
// first_byte = 0, second_byte = 1 or vice versa 
// depending on source data endianess
于 2012-08-09T18:22:01.263 に答える