2016-04-06 6 views
1

を読むかどうかをチェックし、私は次のような構造のメッセージを処理するTCPサーバーを持っている:のLabview - TCPバッファがより多くのデータが含まれている

[ Msg. Size (2 Byte) | Msg. Payload (N Byte) ]

次のようにプロセスは次のとおりです。

  1. 読みますペイロードサイズNを識別するためにTCP接続から2バイト。
  2. ペイロードバイトであるNを読んで、何かをしてください。
  3. TCP接続を閉じます。

ネットワークのオーバーヘッドを軽減するため、複数のメッセージをピギーバックしたいと思います。

[ Msg. Size #1 | Msg. Payload #1 ][ Msg. Size #2 | Msg. Payload #2 ] ...

TCPバッファを読めば明らかに処理ループは、TCP接続を閉じてはならない多くのデータが含まれている(空ではありません)。より多くのデータがTCPで提供されて確実にチェック場合

にどのような方法がありますがのLabview 2013内からのバッファを読んで?

read()にもう一度電話をかけて、タイムアウトしているかどうかを確認できます。しかし、私は不要なレイテンシを導入するので、この解決方法を避けたいと思います。

上記の処理ループでは、標準のLabview TCP VIが使用されます(たとえば、TCP待機待機リスナー、TCP読み取り、TCP書き込み、TCPクローズ接続)。

答えて

0

クライアントは、クエリをもう送信したくないとすぐに、接続の送信側にshutdownを送信する必要があります。サーバーは接続からの読み取りを維持する必要があります。相手側が送信側をシャットダウンしたことが検出された場合は、最終応答を送信するとすぐに接続をcloseにすることができます。

readがタイムアウトするのを待つ必要はありません。すべてのデータが読み込まれるとすぐに半閉接続を検出する必要があります。

何らかの理由でハーフクローズ接続をサポートできない場合は、サーバーが受け取ったデータに最終要求を示す何らかの方法が必要です。あなたは特別な "私は終わった"メッセージでこれを行うことができます。他の方法があります。

ところで、アプリケーションレベルのメッセージを表すために「パケット」という用語を使用しないでください。単一の要求または応答を表すアプリケーションレベルのデータ単位を指すには、「メッセージ」という用語を使用する必要があります。

0

タイムアウト時間は0にすることができます。次に、あなたは不当なレイテンシを導入しません。

+0

それは永遠にブロックされます。 – EJP

+0

いいえ、そうではありません。ゼロは、チェック・アンド・ドン・ウェイを意味します。負の1はそれを永遠にブロックします。ドキュメントから引用: "timeout msは、タイムアウトエラーを報告する前にモードが待機する時間をミリ秒単位で指定します。デフォルトは25,000msです。値-1は無限に待機することを示します。 – srm

+0

答えは実際には正しいです。 2を「読み込むバイト」に、0を「タイムアウトms」に配線します。次に、エラークラスターのコード123(タイムアウト)を確認します。エラー123が設定されている場合、タイムアウトが発生してデータは送信されません。そうでない場合、関数は2バイトのメッセージサイズを生成します。ただし、1つのsend-callでデータを送信する場合は注意してください。そうでない場合は、2つのメッセージ間のデータだけをチェックし、「タイムアウト」を取得する可能性があります。 – PhilMasterG

関連する問題