![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket.Socket.Connections[] ... [D7, WinXP]
artemon © (2005-04-07 09:13:00)Люди подскажите пожалуйста:
В обработчие TServerSocket.onClientRead
procedure Tmain_form.PServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
...
end;
нужно определить какой номер Pserver.Socket.Connections[?] в данный момент задействован, т.е. к моему серверу может подключаться несколько клиентов даже с одним и тем же ip и мне надо знать какой запрос на каком коннекте сервера находится ...
Dmitri_ru (2005-05-11 06:46:00) [1]Почему 2IP и 2Port'а?
1 ip/port - это ip/port клиента
мне кажется этого достаточно - ведь на одной машине физически не могут находиться 2 клиента на одном порте!!!!
а второй какой?
Eraser (2005-04-16 14:54:00) [2]Dmitri_ru
Не верное утверждение. Уникальность соединения обеспечивает не 1 IP и 1 Port, а 2 IP и 2 Port'a.
Dmitri_ru (2005-04-16 12:33:00) [3]Сделать привязку по Ip + port. И все. У каждого Connections[] есть уникальный номер порта, даже если IP у всех одиноковый.
artemon (2005-04-07 10:18:00) [4]спасибо! пошел разбираться
Digitman (2005-04-07 10:09:00) [5]
> Делать привязку по ip не покатит
а делать привязку по индексу в списке тем более неразумно и неправильно, потому что список Connections может поменять свое содержимое в любой момент времени, и клиент, распознанный тобой в дан.момент под таким-то номером в этом списке, вовсе не обязан иметь тот же номер в списке в последующие моменты времени
а вот адрес экз-ра объекта TServerClientWinSocket (того самого, передаваемого тебе в событии чтения 2-м параметром) будет уникален и неизменен .. его и фиксируй в структуре эл-та твоей очереди обработки .. обратившись впоследствии по этому адресу ты пошлешь рез-т обработки именно тому самому клиенту .. если же в момент отправки рез-та обработки обращение к объекту вызвало исключение, это значит что клиент уже неактивен или произошла иная транспортная ошибка для данного соединения
artemon (2005-04-07 09:56:00) [6]мне надо не сразу отправлять ответ! Принятые данные записываются во временное хранилищи и ожидают своей очереди обработки. Потом они обрабатываются, формируется ответ и посылается клиенту, номер коонекта которого закреплен за данным запросом.
т.е. принцип работы такой: принимает, ставим в очередь, обрабатываем, отсылаем ...
Делать привязку по ip не покатит, т.к. с одного IP может подключаться большое количество клиентов. (больше одного)!
Digitman (2005-04-07 09:26:00) [7]
> нужно определить какой номер Pserver.Socket.Connections[?]
> в данный момент задействован
зачем он тебе нужен ? тебе тут же ответить этому клиенту нужно ?
ну и отвечай ему ! незачем для этого знать индекс данного соединения в списке Connections ..
2-й параметр процедуры обработки события OnClientRead - это TServerClientWinSocket, используй его send-методы для отправки инф-ции именно тому клиенту, событие чтения данных от которого в наст.момент тобой обрабатывается