2009-06-07 8 views
0

サーバがtcp/ip接続でクライアントを受け入れると、新しいソケットが作成されます。Socket.LocalEndPointを一意のIDとして使用しても安全ですか?

LocalEndPointポート(クライアントの観点から)をIDとして使用しても安全ですか? 例(サーバーの観点から):私のローカルマシン上

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

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

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

TY。

答えて

2

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

これを考えると、同じポート番号から同じポート番号への複数の接続を持つことができます。別のリモートアドレスに転送します。通常、同じローカルポートを複数のアウトバウンド接続に使用するには、具体的には のアクセス許可を要求する必要があります。

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

自分で設定した接続のうち、自分のクライアントアプリケーション内で一意の識別子が必要な場合は、ローカルポートが行います。

+0

nosさん、Duckさん、John Saundersさん、divinciさんのおかげで、あなたの回答はすべてとても良いです。 非常に役に立ちました。再度、感謝します。 –

0

「クライアント」を一意の識別子として使用するだけではどうでしょうか。一意の識別子は値型である必要はありません。

0

最初の質問に対する短い答えはおそらくいいえです。クライアントOSは通常、ある範囲からポートを選択します。たとえその範囲が40〜50,000であっても、サーバが十分にビジーであれば、遅かれ早かれ、異なるクライアントから同じポートが入ってくることがあります。もしそれが忙しいサーバーでなければ、あなたは幸運になるかもしれません。

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

クライアントのアドレスとポートを一時的なIDとして使用できないのはなぜですか?

1

各(受け入れられた)接続に対してリモートエンドポイントを使用しないでください(GUIDを作成しないでください)。 (HTTPセッションよりもはるかに良い)それを保存するために、クライアントを取得し、あなたに向け、後続のHTTPヘッダ:)その後、

にGUIDを追加!! -

は、クライアントのソケットに戻ってGUIDを渡しますHastTableの完璧な必要性<>!私が知っている状況のカップルだけ!

関連する問題