2009-07-06 11 views
0

私はasioを使用するときに特有の問題を理解する助けが必要です。boost asio:0バイト書き込み

私はサーバ(Javaで書かれた)に2バイトのヒアビート(例えば、毎秒)を送信するC++クライアント(boost asioを使用)を持っています。サーバは正しく2バイトのHeartBeatを受信しますが、それ以降サーバの「読み取り」は0バイトの読み取りに不満を持ち、接続を閉じます(これはブロッキングの読み込みには正しいと思われます)。しかし、クライアントは常に正しい金額を送金していることを表示します。

私は、関数の 'write'ファミリのほとんどすべての変種を実験しました。それらのすべてが 'write_some'の観点から実装されていますが、これはこの動作が期待されることを意味しますか?

私は自分の使い方で間違いを犯しているに違いありません。基本的に私はasio内で書き込み(少なくとも1バイト)を保証するものを探しています。私が間違っている場所を見つけ出すのを手伝ってください。さらに詳しい情報が必要な場合は... 何かアドバイスありがとう!感謝! ありがとう!

答えて

1

ソケットの場合は、「書き込みを保証する」ことはできません。ネットワークがダウンしていたり​​、ケーブルがはぎ取られたり、スイッチが起動したり、電源が全世界に届いていて、コンピュータがバッテリで動作している唯一のコンピュータであればどうしますか?

これは、ある種のバッファリング/空の問題があるように思えるかもしれませんが、読んだコードをチェックして、表示されるすべてのデータを実際に消費することを確認してください。

0バイトの読み取りはエラーではありません。そのコードをもう一度見て、ソケットのエラーステータスフラグなどを確認してください。読書は「もう一度」の状態で失敗する可能性があります。これは本当にやり直す必要があることを意味します。

+0

こんにちは、お返事ありがとうございます。 'read'はjavaサーバにあり、コードを読むと古典的な 'select'のように見えますが、その後 '(' blocking ')' read 'が続きます(EAGAINはノンブロッキングだったセット)。すべてのそれは他のJavaクライアントは問題ありません。 私はちょっと混乱していますが、通常のブロッキング読み込み呼び出しでは0バイト読み込みになります(n/wの書籍とドキュメントにはすべてeof/failureとして読み込まれます)。 ブロック書き込みは短くてもかまいませんtfrではなく、すべてのバイト)、それは今までに0のTCPのペイロードを送信することができますか? –

+0

0を返す読み込みは、 "もう一方の端がTCP接続を閉じた"というかなり標準的な方法です。たとえば、と確認してください。 wiresharkのようなネットワークモニタ。 – nos

1

strace両端のアプリケーション。 によって返されるエラーコードが表示されます。()、()などがあります。アプリケーションがマルチスレッドの場合は、strace -fを使用してください。

このアプローチの利点は、java、C++、pythonのすべてのアプリケーションがstraceで同じよ​​うに見えるため、悪い動作を見つけやすくなります。

この場合、おそらくtcp接続が正常に終了したことがわかります。

関連する問題