それは一意のIDとしてSocket.LocalEndPointを使用しても安全ですか?

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

  •  12-09-2019
  •  | 
  •  

質問

サーバーは、TCP / IP接続を介してクライアントを受け入れると

、新しいソケットが作成されます。

これは、IDとして(クライアントの観点から)LocalEndPointポートを使用しても安全ですか? (サーバの観点から)例:

int clientId = ((IPEndPoint)client.RemoteEndPoint).Port;

私のローカルマシン上で、ポートが一意であるように思われるが、別のマシン上で複数のクライアントと、それは必ずしもそうではないかもしれない。

私の2番目の質問: ポートは、サーバ(ひいてはプロトコルスタックが)(サーバーの観点から)2つのクライアントソケットを区別することができますどのように、一意のIDのように使用することはできません言ってみましょう。

TYます。

役に立ちましたか?

解決

ソケットの一意性は、4つの値によって識別される:(ローカルIP、ローカルポート、リモートIP、リモートポート)、それはプロトコルスタックは、接続を識別する方法の

この考えると、あなたは、同じポート番号に同じポート番号から複数の接続を持っていますが、例えばすることができます異なるリモートアドレスへ。通常は、具体的に要求する必要が 許可が1つの以上のアウトバウンド接続のために同一のローカルポートを使用する。

あなたの例のint型のclientId =((IPEndPoint)client.RemoteEndPoint).Port。ローカルポートを使用しますが、リモートエンドのポートはありません。異なるクライアントが同じポートを選択したことが起こるかもしれないので、これは、確かにユニークではありません。お使いのサーバポートはおそらく固定され、常にすべての接続で同じになります。したがって、あなたは、サーバー側でユニークな何かをしたい場合、あなたは上記の4つの値を使用する必要があります。

あなただけあなた自身を設定した接続の間で独自のクライアントアプリケーション内で一意の識別子が必要な場合は、

ただし、ローカルポートが行います。

他のヒント

リモートエンドポイントを使用しないでください - GUIDを作成 - 各(受け入れ)接続のための

クライアントソケットに戻しGUIDを渡す - それ(HTTPセッションよりもはるかに良い)を保存するために、クライアントを取得し、あなたに向け、後続のHTTPヘッダにGUIDを追加します。)

そして!! HastTableにぴったりの必要性<> !!!私の知っている状況の唯一のカップル!

なぜ、一意の識別子として「クライアント」を使用していません。一意の識別子が値型である必要はありません。

最初の質問への短い答えはノーだろうです。クライアントのOSが通常の範囲からポートを選択します。その範囲は40から50000大きい場合であっても、あなたのサーバが十分にビジー状態であるならば、遅かれ早かれ、あなたは同じポートが異なるクライアントから入ってくる必要があります。それがビジーなサーバーではない場合、あなたは幸運かもしれません。

ソケットは、アドレス/ポート/プロトコルのペアに基づいて互いに区別されます。クライアントとサーバーからこれらの値の組み合わせセットが一意になります。

なぜ、あなただけの一時的なIDとしてクライアントアドレスとポートを使用することはできません?

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