TCP 経由で互いにバイト配列を同時に送信する ac# サーバー/クライアントを作成しようとしています。これを達成する方法について頭を悩ませようとしています。私が見たすべての例は、メッセージを待ってから応答を送信します。同時に起こるコミュニケーションが必要です。
サーバーとクライアントの両方で、受信と送信のために 2 つの個別の TCP ソケット接続を作成する必要がありますか? 「全二重」方式で 1 つの接続で同時にデータを渡すことはできますか? どんな助けでも大歓迎です。
非同期ソケットを確認することをお勧めします。その理由は、データの送受信中にスレッドをブロックしないためです。
Socket.BeginReceive(buffer, offset, size, endReceiveMethod);
endreceive メソッドは、受信したバイトがある場合に呼び出されます。(別のスレッドで)これは送信の場合と同じです。
Socket.BeginSend(buffer, offset, size, endSendMethod);
初期の頃、同じスレッドで読み取りと書き込みを行うこと、読み取りタイムアウトなどで難しい構造を作成すること、および各クライアントが独自のスレッドを作成することについて心配していたことを覚えています。
これは、非同期ソケットでは必要ありません。クライアントごとに単一のスレッドを使用しません。スレッドをブロックする代わりに、I/O 完了ポートhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspxを使用します。
select() メソッドを使用して、サーバーとクライアントのファイル記述子 (または fd) をリッスンすることを検討する必要があります。http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select.aspx
基本的に、TCP サーバーがある場合、たとえば fd0 とします。クライアントが接続を送信すると、サーバー fd は新しい接続用に新しい fd を作成します。これを fd1 と呼びます。ここで、(a) fd0 で新しい着信接続をリッスンする、(b) fd1 でデータを受信するのを待つ、(c) fd1 でデータを送信する、の 3 つのことを行う必要があります。通常、データの送信はブロックされないため、心配する必要はありません。ただし、(a) と (b) については、select を使用できます。fd1 に読み取るデータがある場合は、読み取りイベントを取得します。同様に、fd0 に新しい接続がある場合も、読み取りイベントが発生し、accept を呼び出すことができます。