私は、主に楽しみのためだけでなく、教育目的でも、単純な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プロトコルに関する主なドキュメントです。
私が十分に明確になったことを願っています。