3

大量のメッセージを (.NET 非同期) TCP サーバーに送信する .NET TCP クライアントがあります。

サーバーにメッセージを送信し続ける必要がありますが、TIME_WAIT のためにクライアントのポートが不足しています。

使用可能なすべてのポートを使用せずに、プログラムが継続的かつ確実にメッセージを送信するにはどうすればよいでしょうか?

同じソケットを再利用し続ける方法はありますか。Disconnect() と REUSEADDRESS ソケット フラグを見てきましたが、それらの使用の良い例が見つかりません。実際、ほとんどのソースは、Disconnect は低レベルで使用するため (つまり、ソケット ハンドルのみをリサイクルするため) 使用しないと述べています。

UDP に切り替えるか、C++ と IOCP を使用する方法があるのではないかと考えています。

4

6 に答える 6

5

サーバーとクライアントがデータの形式を認識している場合は、ソケットを開いたままにすることができます。クライアントが「完了」したことをサーバーが「確認」できるように、ソケットを閉じています。

何らかのプロトコルがある場合、サーバーはデータのブロックの受信がいつ終了したかを「知る」ことができます。

ある種のメッセージ終了トークンを探したり、メッセージの長さを渡したり、サイズに基づいて残りを読んだりできます。さまざまな方法があります。

しかし、サーバーへの接続を頻繁に開いたり閉じたりする理由はありません。

于 2008-10-01T18:18:40.030 に答える
1

TCPは、ネットワークの輻輳を防ぐために非常に懸命に努力します。すべての新しいTCP接続は「スロースタート」状態で始まり、1つのパケットのみを送信し、もう一方の端からの確認応答を待ちます。ACKが受信されると、TCPは最大ウィンドウサイズに達するまで2パケット、次に4パケットなどを送信します。

高データレートでメッセージを生成している場合は、TCP接続の開閉を避けたいと考えています。新しい接続を開くたびに、スロースタートに戻ります。ソケットを開いたままにしておくことができれば、TCP接続はスロースタート状態を通過し、はるかに高いレートでデータを送信できるようになります。

これを行うには、サーバーに接続上の複数のメッセージを処理させる必要があります(つまり、各メッセージを描写する方法を見つけることを意味します)。サーバーがあらゆる種類のHTTPエンコーディングをサポートしている場合、これは機能します。「持続的」接続またはHTTP1.1に関連する引数または構成を必ず調べてください。これは、HTTPが単一のTCP接続を介して複数の要求を送信する方法であるためです。

あなたが言及した1つのオプションはUDPです。適度に高いレートでメッセージを生成している場合、途中でキューがいっぱいになるため、メッセージの一部が失われる可能性があります。送信するメッセージの信頼性が必要な場合、UDPはおそらく適切な基盤ではありません。

于 2008-10-01T18:51:01.280 に答える
1

クライアントが同じソケットを開いたままにして、ループでメッセージを送信できますか?

open socket connection

while(running)
    send messages over socket

close socket connection
于 2008-10-01T15:24:34.397 に答える
0

メッセージ キューイング サービスに沿ったものは、あなたのプロジェクトに利益をもたらしますか? そうすれば、クライアントはサーバーにできるだけ多くのメッセージを渡すことができ、サーバーはそれらのメッセージをキューから可能な限り迅速にプルすることができ、クライアントが処理できる以上のメッセージを送信している場合、それらは単純になります。キューに入り、処理されるのを待ちます。

C# を使用したメッセージ キューイング サービスの構築に関するこの MSDN ドキュメントを簡単なグーグル検索で見つけました。

于 2008-10-01T17:14:13.260 に答える
0

そのようにコーディングすると、機能しません。

サーバーは最初のメッセージのみを受信します。

ソケットを開いたり閉じたりすると、サーバーは動作しますが、クライアント ポートが不足します。

サーバーの設計が原因で、クライアントをそのようにコーディングする必要があると思います。

では、.NET を使用して非同期サーバーをどのようにコーディングするのでしょうか。私は MSDN の例と多数の例をオンラインでたどってきました。

于 2008-10-01T15:49:30.623 に答える
0

TCP サーバー (どの言語でも) を作成する際の基本的な考え方は、1 つのポートを開いて接続をリッスンし、新しいスレッドまたはプロセスを作成して新しい接続要求を処理することです。

open a server socket // this uses the port the clients know about

while(running)
    client_socket = server_socket.listen
    fork(new handler_object(client_socket))

C#の良い例を次に示します。

于 2008-10-01T18:13:44.833 に答える