3

このAsync Sockets exampleを読むと、次のコードが見つかります。

    // Get the socket that handles the client request.
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);

これら 2 つのソケットの違いに関するドキュメントを見つけるのに苦労しています。また、ハンドラーをシャットダウンするか、ハンドラーを閉じると元のソケットにどのような影響があるかを知りたいです。誰かがこれを説明できますか、またはいくつかのドキュメントを教えてくれますか?

4

3 に答える 3

2

ソケットは、特定のマシンでの一意の接続127.0.0.1:1024です。一度に確立できるアクティブな接続は1つだけです。「リスナー」は修正ポートでリッスンします(たとえば、上記の例では1024)。仕事は、接続を受け入れる「パブリック」な方法になることです。接続を受け入れると、新しいランダムに(まあ、合理的に疑似ランダムに)選択したポートに新しいソケットを作成します。次に、元の接続アプリケーションとホストは、そのソケットを介して通信し、リスニングソケットを解放して、別の接続を取得できます(これにより、新しい接続のために別のポート番号が割り当てられます)。

EndAccept通常、接続が確立されたら、これですべてです。通常、listener受け入れる接続が増えるのをリッスンします。そうでない場合は、通常、ソケットを破棄または閉じるだけで、リスニングを停止し、保留中の承認をキャンセルします。は、ソケットhandlerとは完全に独立して、アプリケーションが必要とするあらゆる通信を行うために使用されます。listenerソケットを使い終わったら、handlerそれを破棄または閉じます。ソケットlistenerは独立しているため、「実行」を続けます。

Shutdownコネクション型ソケット(前に呼び出される)で保留中のデータをフラッシュし、Close他のソケットには影響しません。

于 2012-08-18T04:08:17.187 に答える
1

ソケットに基づく.NETサーバーアプリケーションには、少なくとも2種類のソケットが含まれます。

  1. インバウンド接続を(同期的または非同期的に)リッスンするためのリスナーソケット
  2. リスナーソケットのAccept()メソッドを呼び出すことによって返されるクライアントソケット。

あなたが参照している例は非同期リスニングの例であり、ソケットは最初に非同期メソッドのアドレスをパラメーターとしてBeginAccept()メソッドを呼び出します。これで、対応するEndAccept()メソッドを呼び出さないと、元のリスナーソケットがブロックされ、クライアントからのそれ以降の接続が失われる可能性があります。

Socket.ShutDown(Both)メソッドは、接続を使用してソケットを正常にシャットダウンするために使用されますが、Socket.Disconnect(True)は同じことを強制的に実行します。いずれの場合も、Socket.Close()はこれらのメソッドに従う必要があります。詳細については、次のSOリンクを参照してください:c#/。Net Socket.Shutdown

于 2012-08-17T22:56:14.657 に答える
1

リスナーは、接続をリッスンしているソケットです。リスナーを占有したままにしないでください。そうしないと、複数のクライアントがそのソケットを介して接続できなくなります。そのソケットで EndAccept を呼び出すと、サーバーがクライアントと通信するためのソケットが提供され、より多くの接続のためにリスナーが開かれます。

ハンドラーを閉じても、リスナー ソケットには影響しません。

于 2012-08-17T22:10:25.020 に答える