Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Идентификация клиентов


Автор: SanLLIer 8.2.2010, 19:57
Проблема с идентификацией клиентов. Использую socket.handle, но когда клиент подключается к серверу у его "хэндл" = 640 (допустим), а через несколько секунд, когда от того же клиента приходит сообщение, его "хэндл" = уже 154156. 
Как бороться? Или может подскажете другой способ идентификации клиентов?

Автор: kami 8.2.2010, 20:05
Socket.SocketHandle.
И зачем что-то из идентификаторов соединения постоянно принимать от противоположной стороны?
Чем не устраивает то же самое, но у сервера?
Тот же ServerSocket1.Socket.Connections[i].SocketHandle ?

Автор: SanLLIer 8.2.2010, 20:48
Про сервер и говорю.
На стороне сервера я определяю хэндл клиента при подключении последнего к серверу, но когда спустя пару секунд клиент обращается к серверу снова, то у него уже другой хэендл(!). Как такое может быть? Или я что-то "недогоняю"?

Автор: kami 8.2.2010, 22:29
Цитата(SanLLIer @  8.2.2010,  20:48 Найти цитируемый пост)
когда спустя пару секунд клиент обращается к серверу снова, то у него уже другой хэендл(!). Как такое может быть?

Если клиент отключился и потом подключился опять, то хендл однозначно будет другой. Если соединение осталось то же, то хендлы не меняются.
В первом случае для локалки могу предложить использовать Socket.RemoteAddress (вообще, соединение идентифицируется парой адрес:порт, но при втором подключении адрес будет тот же, а вот удаленный порт поменяется). Если предполагается работа через интернет, то в общем случае - только отправка серверу какой-либо информации о клиенте (что-то типа уникального номера, хеша логина/пароля и т.п.), позволяющая идентифицировать клиента.
Во втором случае (соединение не прерывалось) - такого быть не может, хендл присваивается сокету 1 раз и не меняется за время, пока подключение не будет разорвано smile

Автор: SanLLIer 8.2.2010, 22:52
Допустим. А как сделать чтобы коннект не рвался?

Автор: kami 8.2.2010, 22:58
Цитата(SanLLIer @  8.2.2010,  22:52 Найти цитируемый пост)
 А как сделать чтобы коннект не рвался?

Хороший вопрос, но не по адресу.
Есть причины, не зависящие от программы - начиная от глюков провайдера заканчивая банальным выдиранием кабеля. Если не брать их в расчет, то решение может быть только одно - исключить (в разумных пределах, конечно) Socket.Close и т.п. Как это сделать - Вам лучше знать, код Ваш, а не мой.

Автор: SanLLIer 9.2.2010, 11:43
Что странно закрываю канал я только в конце программы (при закрытии формы т.е. smile )
Ну да ладно. Пойду по другому пути... Спс

Автор: Mikel 9.2.2010, 12:57
Может в Вашей реализации будет проще работать с указателями на сокеты?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)