単一のスレッドでTCPにフルデュプレックスチャネルを実装する方法は?
-
10-10-2019 - |
質問
私が書いているネットワークLIBは、TCPソケットを介してメッセージを送信して受信する必要があります。メッセージはいつでも送信または受信できます。つまり、完全な二重チャネルとして機能するはずです。
メインスレッド呼び出しsend()と、主にrecv()コールでブロックされた専用スレッドの2つのスレッドを使用して、このようなシナリオを実装することができました。
私の質問は、単一のスレッドで同じシナリオを実装することは可能ですか? IEコールバック関数を登録しますか?
サイドノートとして:C ++、Java、Pythonでこのシナリオを実装する必要があります。
解決
はい、それは可能です。多重化されたI/Oを許可するAPIを使用する必要があります。 C/C ++およびPythonの下では、Select()および非ブロッキングI/Oを使用できるため、ネットワークが唯一のブロックを呼び出すことがselect()です。また、Poll()およびEpoll()、および同じことを達成する他の多くの同様のAPIもあり、効率と携帯性の程度がさまざまです。 Javaは持っています 非ブロッキングI/O API また。
別の可能性は、非同期I/Oを使用することです。この場合、OSにI/Oトランザクションを開始するように指示し、操作が終了したときに(何らかのメカニズムによって)通知されます。私はそのスタイルのネットワークプログラミングに精通していないので、詳細を説明しようとはしません。
他のヒント
一般に、ライブラリは、アプリケーションのメインループ /イベントループにインターフェイスを提供することにより、これを行います。
たとえば、ほとんどのシングルスレッドネットワーク使用アプリケーションには、 select()
, poll()
または類似。あなたのライブラリは、アプリケーションがその中に含めるべきファイル記述子を返すだけです select()
/ poll()
そのファイル記述子が読み取られたときにアプリケーションが呼び出す必要があるコールバック関数を呼び出します。