1

Qtを使用してUdpおよびTcpサーバー/クライアントを構築しています。最近のプロジェクトでは、Qtは許可されておらず、Boostを使用することになっています。boost :: asioを実行した後、非常に多くの機能があり、使用法がQtとは大きく異なるため、混乱します。Udp(マルチキャスト、ブロードキャストなど)の場合、私は多かれ少なかれ明確になりました。しかし、Tcpの場合、理解に問題があります。

(すべて非同期にする必要があります)

  1. TCPはストリーム指向であるため、到着したバイト数を知る方法はありません。したがって、を使用しますasio::ip::tcp::socket::async_read_some()。ただし、Qtには、シグナルに関するすべてのデータを読み取り、を返すreadAll()ように作成できるソケットがあります。サイズは大きくなる可能性があるため、指定する必要はありません。Boostでこれを達成するにはどうすればよいですか?シグナルは大まかにマップされると思いますが、残り(および「成長可能な」/配列はどうですか? )readyRead()QByteArrayreadyRead()async_read_some()readAll()buffer

  2. disconnected()TCP接続が切断された場合(サーバー/クライアントがオフ、LANケーブルが接続されていないなど)、Qtで信号が送信されます。Boostの同等のチェックは何でしょうか?ハートビートメッセージを自分で定期的に送信して期待するためにタイマーが必要ですか?

4

1 に答える 1

1
  1. 適切な完了条件でasync_read free 関数のオーバーロードを使用します。ご覧のとおり、この関数はasio::streambuf自動的に成長する を受け入れます。

  2. はい、ポータブルで信頼できる唯一の方法は、ハートビートを送信することです。Qtがどのようにそれを行うのかわかりませんが、ネットワークケーブルを切断して、Qtから通知が届くかどうかを確認してください...

于 2013-02-10T14:33:53.097 に答える