単一のスレッドでTCPにフルデュプレックスチャネルを実装する方法は?

StackOverflow https://stackoverflow.com/questions/4675824

質問

私が書いているネットワーク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() そのファイル記述子が読み取られたときにアプリケーションが呼び出す必要があるコールバック関数を呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top