1

定期的に緊急の範囲外データを受信できるTCPサーバーを開発する必要があります。これを実現するために、POCOC++ライブラリを使用しています。StreamSocketクラスの(不足している)ドキュメントでは、これを達成するのは非常に簡単なタスクであることがわかります。次のようにreceiveBytes()メソッドを使用するときにSO_OOBINLINEフラグを設定することによって実行する必要があります。

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );

これをテストするために、「sendUrgent()」メソッドを使用してOOBデータ(1バイト)を送信する非常に単純なTCPクライアント(POCOライブラリも使用)を作成しました。

ss1.sendUrgent( 0xFF );

OOBデータを送信しても、何も起こりません。サーバーはそれに気づいていないようです。

一方、sendBytes()メソッドを使用して「通常の」データを送信する場合、StreamSocketにSO_OOBINLINEフラグが設定されていると、同じ送信データを無限に受信します(誰もいないにもかかわらず同じデータを読み取り続けます)再送)。

私は何が欠けていますか?

編集:@JimRの提案とこれを読んだ後、私は試しました:

n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );

そしてこれさえ:

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE | MSG_OOB );

どちらも同じ例外を発生させます:無効な引数。

4

1 に答える 1

2

私は(久しぶりです)あなたは変えるべきだと思います

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );

n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );

編集setsockopt:上記の変更に加えて、フラグと適切な引数を使用して呼び出す必要があります。SO_OOBINLINEこれにより、OOBデータは、別のチャネルではなく通常のストリームで表示されます。あなたの場合、コメントに記載されているように、を呼び出しますss.setOOBInline(true);

SO_OOBINLINEで使用されるソケットオプションsetsockoptです。

MSG_OOBrecvsend会社の旗です。

于 2012-09-12T16:21:09.813 に答える