Безопасно ли использовать Socket.LocalEndPoint в качестве уникального идентификатора? - PullRequest
0 голосов
/ 07 июня 2009

Когда сервер принимает клиента через соединение TCP / IP, создается новый сокет.

Безопасно ли использовать порт LocalEndPoint (с точки зрения клиента) в качестве идентификатора? Пример (с точки зрения сервера):

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

На моей локальной машине порт кажется уникальным, но при наличии нескольких клиентов на разных машинах это не всегда так.

Мой второй вопрос: Допустим, порт нельзя использовать как уникальный идентификатор, как сервер (и, следовательно, стек протокола) может различать два клиентских сокета (с точки зрения сервера).

TY.

Ответы [ 4 ]

2 голосов
/ 07 июня 2009

Уникальность сокета определяется 4 значениями: (локальный IP, локальный порт, удаленный IP, удаленный порт), и именно так стеки протокола идентифицируют соединение.

Учитывая это, вы можете иметь несколько подключений с одного и того же номера порта к одному и тому же номеру порта, но, например, на другой удаленный адрес. Как правило, вы должны специально запросить разрешения на использование одного и того же локального порта для более чем одного исходящего соединения.

Ваш пример int clientId = ((IPEndPoint) client.RemoteEndPoint) .Port; не использует локальный порт, но порт на удаленном конце. Это, конечно, не уникально, поскольку разные клиенты могут выбрать один и тот же порт. Ваш порт сервера, вероятно, фиксирован и всегда будет одинаковым для всех соединений. Таким образом, если вы хотите что-то уникальное на стороне сервера, вы должны использовать 4 значения, упомянутые выше.

Однако, если вам нужен только уникальный идентификатор в вашем клиентском приложении среди подключений, которые вы настроили самостоятельно, подойдет локальный порт.

1 голос
/ 07 июня 2009

Не используйте удаленную конечную точку - создайте GUID - для каждого (принятого) соединения.

Передайте GUID обратно в сокет клиента - попросите клиента сохранить его (намного лучше, чем сеанс HTTP) и добавьте GUID к любым последующим HTTP-заголовкам, направленным на вас:)

тогда !! идеальная потребность в HastTable <> !!! я знаю только пару ситуаций!

0 голосов
/ 07 июня 2009

Короткий ответ на первый вопрос, вероятно, нет. Клиентская ОС обычно выбирает порт из диапазона. Даже если этот диапазон составляет 40-50 тысяч, если ваш сервер достаточно занят, рано или поздно у вас может быть один и тот же порт, приходящий от разных клиентов. Если это не загруженный сервер, вам может повезти.

Сокеты отличаются друг от друга на основе пар адреса / порта / протокола. Объединенный набор этих значений от клиента и сервера будет уникальным.

Почему вы не можете просто использовать адрес клиента и порт в качестве временного идентификатора?

0 голосов
/ 07 июня 2009

Почему бы просто не использовать "клиент" в качестве уникального идентификатора. Уникальный идентификатор не обязательно должен иметь тип значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...