![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз на счет Сокет Сервера [D5, Win95/98, NT4]
Gliser © (2003-04-04 09:54:00)Добрый день, уважаемые мастера.
Я внимательно изучил конференцию, но так и не нашел ответа.
У меня есть программа сервер. Клиенты к ней подцеплены постоянно, т.е. постоянно посылают запросы. Как на сервере узнать какой именно клиент прислал запрос, для того чтобы не посылать ответ всем.
Спасибо!
nikus (2003-04-05 05:50:00) [1]В списке параметров процедуры ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket) можно заметить параметр Socket. Так вот, если ответ клиенту нужно послать в этой же процедурке, то вместо ServerSocket1.Socket.Connections[i].SendText(s) пишите Socket.SendText(s).
Если же ответ нужно слать в другой процедурке, то
1. Заведите глобальную переменную MySock : TCustomWinSocket;
2. В обработчике ServerSocketClientRead напишите MySock := Socket;
3. В нужном месте программы посылайте через MySock, то есть MySock.SendText(s);
nikkie (2003-04-05 00:29:00) [2]>if Socket.Connections[index] = Socket then ...
или что эквивалентно, но несколько быстрее работает
if False then ...
:)
panov (2003-04-04 19:05:00) [3]if Socket.Connections[index] = Socket then ...
Digitman (2003-04-04 14:15:00) [4]
> В данной процедуре все равно какой клиент прислал запрос
как это "все равно" ? параметр Socket извещает тебя о конкретном клиенте, приславшем запрос !
когда тебе нужно сделать бродкаст всем прочим клиентам, кроме данного, та просто перебираешь в цикле по списку Connections[] всех клиентов, которые не равны данному Socket, и отправляешь им нужную инф-цию
Gliser (2003-04-04 13:34:00) [5]Я плохо объяснил. Попробую на примере. Допустим у меня три клиента подключены к серверу и постоянно общаюся с ним, т.е. для них уже соединения установлены. Сервер читает запросы клиентов с помощью процедуры ServerSocketClientRead. В данной процедуре все равно какой клиент прислал запрос. А мне бы хотелось знать кто 1, 2 или 3 клиент, чтобы ответ послать на соответсвующее Connections[1, 2 или 3]. Вопрос мой звучит так: как одназначно определить клиента в процедуре ServerSocketClientRead, чтобы можно было ему ответить?
Digitman (2003-04-04 12:59:00) [6]список Socket.Connections[..] и есть список тех самых уникальных объектов Socket: TServerClientWinSocket, каждый из которых "родился" для тебя в событии OnClientConnect, и фигурирует во всех последующих событиях для клиента, ассоциированного с этим Socket: TServerClientWinSocket
savva (2003-04-04 12:44:00) [7]если тебе нужен именно номер (число) - можно при подключении клиента его экземпляр сокета добавлять в TList а потом искать через IndexOf(Socket).
Gliser (2003-04-04 11:14:00) [8]Я чувстую себя полным ламером, но я никак не могу найти через какое свойсто Socket: TServerClientWinSocket , определить номер содединениячтобы после использовать для Socket.Connections[..] в процедуре записи.
Gliser (2003-04-04 10:51:00) [9]Спасибо.
Digitman (2003-04-04 10:35:00) [10]идентификатор клиента - это параметр Socket: TServerClientWinSocket в процедуре обработки события OnClientRead