0

私は、主に楽しみのためだけでなく、教育目的でも、単純なmsnクライアントを作成しようとしています。そして、クロスプラットフォームのサポートが必要なため、BoostAsioを使用してtcpパッケージの送受信を試し始めました。「VER」コマンドを送信して、その応答を受信することができました。

ただし、次の「CVR」コマンドを送信した後、Asioは「ファイルの終わり」エラーをキャストします。さらに調査した結果、パケットスニッフィングによって、メッセンジャーサーバーへのtcpパケットのメッセージの最後に余分な「ヌル」文字(ASCIIコード:00)が含まれていることがわかりました。これは、私のVERコマンドが、メッセンジャーサーバーのように思わない余分な文字を最後に取得することを意味します。したがって、CVR応答を読み取ろうとすると、接続がシャットダウンされます。

これは私のパッケージがそれをスニッフィングするときにどのように見えるかです(それはペイロードです):

(16進数:) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0a 0a 00
(文字:) VER 1 MSNP15 CVR 0 .. ..

Adium(OS X用のチャットクライアント)のパッケージは次のようになります。

(16進数:) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0d 0a
(Char :) VER 1 MSNP15CVR0。。

したがって、私の質問は、各パッケージの最後にあるヌル文字を削除する方法があるかどうか、何かを誤解してAsioを間違った方法で使用したかどうかです。私の書き込み関数(少し編集された)はこれで軽く見えます:

int sendVERMessage() {
    boost::system::error_code ignored_error;
    char sendBuf[] = "VER 1 MSNP15 CVR0\r\n";
    boost::asio::write(socket, boost::asio::buffer(sendBuf),
                       boost::asio::transfer_all(), ignored_error);
    if(ignored_error) {
        cout << "Failed to send to host!" << endl;
        return 1;
    }

    cout << "VER message sent!" << endl;
    return 0;
}

そして、これが私が使用しているmsnプロトコルに関する主なドキュメントです

私が十分に明確になったことを願っています。

4

2 に答える 2

1

バッファを作成するときは、配列を渡します。ただし、配列には末尾のnullターミネータが含まれています。最後のバイトのサイズなしの長さを示す2番目の引数をバッファーに渡しますof(sendBuf)-1

于 2010-06-05T11:53:32.067 に答える
0

boost :: asio :: writeからの戻りコードをチェックして、思った数のバイトを送信していることを確認する必要があります。

于 2010-06-05T01:45:05.210 に答える