0

サーバーが tcp/ip 接続を介してクライアントを受け入れると、新しいソケットが作成されます。

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

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

私のローカル マシンでは、ポートは一意のように見えますが、複数のクライアントが異なるマシン上にある場合、常にそうであるとは限りません。

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

TY.

4

4 に答える 4

2

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

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

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

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

于 2009-06-07T00:18:58.367 に答える
1

(受け入れられた) 接続ごとに、リモート エンドポイントを使用しないでください - GUID を作成します。

GUID をクライアント ソケットに戻します - クライアントにそれを保存してもらい (HTTP セッションよりもはるかに優れています)、GUID を後続の HTTP ヘッダーに追加します :)

それから!!HastTable<> の完全な必要性 !!! 私が知っている状況はほんの2、3です!

于 2009-06-07T02:04:48.047 に答える
0

最初の質問に対する簡単な答えはおそらくノーです。クライアントOSは通常、範囲からポートを選択します。その範囲が40〜5万の場合でも、サーバーが十分にビジー状態であれば、遅かれ早かれ、同じポートが異なるクライアントから着信する可能性があります。それが忙しいサーバーでなければ、あなたは幸運になるかもしれません。

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

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

于 2009-06-07T00:30:26.847 に答える
0

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

于 2009-06-07T00:10:12.520 に答える