1

さて、私は自分自身にいくつかのソケットプログラミングを教えようとしてきました。私は非同期サーバーを使用して小さなC#アプリケーションを作成しましたが、次の点を除いて、ほとんどのことを理解しています。

したがって、サーバーには接続をリッスンするポートがあり、接続を受信すると、通信を行うための別のソケットを作成します。これは私が理解していないことです...理論的にはクライアントがこの新しい接続にどのポートが選択されているかわからない場合、クライアントとサーバー間の通信はどのように行われますか?

すべての回答をありがとう

編集:リスニングスレッドがデフォルトのポートでリッスンしていることを理解している限り、すべてのメッセージはクライアントごとに異なるソケットで処理されますか?

もう一度編集してください:皆さんが私の質問をどのように誤解しているのか。通常のソケット通信を理解しています。私の問題は、リスニングソケットが接続ソケットとは異なる非同期サーバーにあります。つまり。

  1. サーバーはデフォルトポートでリッスンします
  2. クライアントは接続を試みます。
  3. サーバーレシーバー要求。
  4. 次に、サーバーはクライアントとサーバーの間に通信ソケットを作成し、デフォルトのポートでリッスンを続けます。

私の問題は最後のステップです。クライアントは、新しいソケットで通信する方法をどのようにして知ることができますか?ここにいくつかのサンプルコードがあります http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

4

4 に答える 4

3

この質問は 1 年以上前に投稿されましたが、もう少し明確にする (または混乱させる) 価値があると思います。

「クライアントは新しいソケットで通信する方法をどのように知っているのでしょうか?」- クライアントは、新しいソケットが作成されたことを認識していません。同じポートにデータ (パケット) を送信し続けるだけです。

しかし、これは別の問題を引き起こします: サーバーは、どのデータがどのクライアントから来たのかをどのように知るのでしょうか? - TCP および IP プロトコルのおかげで、サーバーはクライアントのアドレスとパケットの送信元ポートの両方を認識します。この情報を使用して、サーバーは複数のクライアントと複数の (クライアント) ポートからパケットを受信し、それらを正しいソケットにルーティングできます。この質問では、サーバー ソケットをフィルターと考えてください。パケットがクライアント X - ポート Y から受信されると、パケットはソケット Z にルーティングされます。

「...別のソケット/ポートで通信する必要があることがわかりましたか?」- これはよくある混乱の原因です。パケットを受信するためにサーバー上に新しいソケットが作成されると (接続が確立された後)、新しいポートは使用されず、元のポート番号が使用され続けます。サーバー側でのソケット作成プロセス全体は、クライアントに対して透過的です。クライアントは、パケットを処理するために新しいソケットが作成されたことを知りません (知る必要もありません)。

詳細については、Google TCP ヘッダーを参照してください。

これが誰かに役立つことを願っています。

于 2012-09-08T09:12:41.943 に答える
1

クライアントがサーバーに接続するとき、接続先のポートを選択します。クライアントには、応答を受信するポートも含まれています。これは通常、ランダムに選択されたポートですが、クライアントがそれを上書きする可能性があります。

電話のようなものだと考えてください。誰かに電話をかけるとき、あなたがかける電話番号があり、あなたにも電話番号があります。2 人で話している場合でも、両方の電話番号が使用されています。

電話番号は IP アドレスに似ており、トランク回線はすべての場合に発信元の電話番号を持っている必要はないため、これは完全な例えではありませんが、同じ概念が適用されます。

簡単に言えば、TCP プロトコルには、発信元ポートと宛先ポート、および発信元 IP アドレスと宛先 IP が必要です。パケットがいずれかの方向に送信される場合、適切な IP/ポートがいずれかの方法で使用されます。

于 2011-07-08T06:55:22.697 に答える
0

定義

  • クライアント: サーバーに接続しているリモート マシンのソケット
  • サーバー: サーバーで接続を待機しているソケット
  • ServerClient: クライアントと通信しているソケット

答え

がポートを受け入れた後、ServerClientポートが にどのように転送されるかについての詳細は見つかりませんでした。しかし、それは握手で転送される可能性が最も高いです。詳細を知りたい場合は、RFC793 を自由に読んでください。ClientServer

詳細については説明しませんが、パッシブ接続について読んで、リスナー ソケットが下位レベルでどのように機能するかについての詳細を確認してください。しかし、基本的にリスナー ソケット ( Server) の目的は、ソケット ( ) を受け入れることだけServerClientです。

が使用するポートServerClientは、オペレーティング システムのソケット実装によって割り当てられ、ユーザーが制御できるものではありません。知っておく必要があるのは、接続されている各ServerClientポートが独自のポートを取得しClient、(スリーウェイ) ハンドシェイク中に に転送されることだけです (私は ;) )

于 2011-07-08T09:45:30.377 に答える
0

実際には、新しい接続は同じポートを使用します。サーバーは特定のポートで着信接続をリッスンし、クライアントから接続要求を受信すると、サーバーはそれを受け入れ、要求を処理するための新しいスレッドを作成します。そして、そのポートでリッスンを続けます。

于 2011-07-08T06:20:20.223 に答える