Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Подскажите пожалуйста как в TServerSocket получить указатель   Найти похожие ветки 

 
O-LG   (2003-02-19 23:29) [0]

Подскажите пожалуйста как в TServerSocket получить указатель или номер подсоединяющегося клиента (TClientSocket), чтобы в дальнейшем именно ему можно было направить сообщение.


 
Digitman ©   (2003-02-20 08:21) [1]

в событии OnClientConnect() для этой цели параметром Socket: TCustomWinSocket тебе передается адрес объекта. Используй этот объект для инф.обмена с клиентом. о подключении которого говорит факт возникновения этого события


 
O-LG   (2003-02-20 09:09) [2]

То, что орабабатывать OnClientConnect я понял, а вот дальше нет. это получается надо получать адрес? ServerSocket.Socket.addr ?
А как потом мне именно этому клиенту из множества других отправить сообщение SendText?


 
Андрей_   (2003-02-26 11:31) [3]

А ты организуй цикл. У всех активных конектов запроси их ip адреса. Так узнаешь на каком конекте нужный тебе клиент.
Например он будет на шестом. Тогда
ServerSocket.Socket.Connections[6].SendText();


 
Digitman ©   (2003-02-26 11:43) [4]


> O-LG


зачем тебе какой-то там "адрес" ?

в событии OnClientConnect() тебе в кач-ве параметра Socket передается экз-р объекта, вызов send-методов которого как раз и дает возможность отправки инф.сообщений конкретно данному клиенту (т.е. клиенту, с которым установлена индивид.связь, управляемая этим объектом)

если же тебя интересует IP-адрес этого клиента, на то есть св-во Socket.RemoteAddr


 
dimich1978 ©   (2003-02-26 17:23) [5]

>>>Андрей_
Это не есть хорошо, сеть засорять.
А вот если бы загнать все коннекты(указатели) к серверу в массив и беря оттуда данные отсылать определенному клиенту, вот это хорошо.
Если "Digitman" поможет, может быть и разберемся.



 
Андрей_   (2003-02-27 07:16) [6]

>Digitman, все таки непонятно, что за экземпляр объекта. И в англ. объяснении как-то туманно. Если приконектилось к серверу шесть клиентов, значит у него шесть активных соединений:
ServerSocket.Socket.ActiveConnections[0-5].
как-же среди них найти именно того клиента который тебе нужен?
Я например именно цикл и организовывал перед каждой отправкой текста. Находил нужный конект и на него отправлял. Знаю, что это громоздко, но работало...
Если знаешь способ лучше, объясни пожалуйста.


 
Verg ©   (2003-02-27 08:31) [7]


> как-же среди них найти именно того клиента который тебе
> нужен?


Как понять: "который тебе нужен"?
Каков критерий "нужности"?

Если это тот клиент, который отправил запрос, то
в обработчике

procedure TTCPServModule.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);

передается Socket - объект управляющий соединением с данным клиентом, и вызвав socket.sendtext вы отправите нужный ответ именно нужному клиенту.


 
Digitman ©   (2003-02-27 08:37) [8]


> все таки непонятно, что за экземпляр объекта


вот шаблон процедуры-обработчика события :


procedure TMyForm.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
...
end;

так вот параметр Socket - это и есть объект класса TCustomWinSocket. И объект этот инициализирован при создании таким образом, что внутри него содержится инф-ция об индивидуальном соедининии сервера ИМЕННО с тем клиентом, коннект с которым и стал причиной возбуждения события OnClientConnect.
Поскольку объект Socket имеет send-методы, вызов этих методов ИМЕННО этого объекта приведет к отправке данных ИМЕННО тому клиенту, с которым ассоциирован этот объект при его создании на стадии коннекта. Т.е. достаточно "запомнить" ссылку на этот объект где-нибудь в стат.переменной (ибо по завершении обработки сообщения лок.переменная Sender станет недоступной и впоследствии то, на что она ссылалась, будет элементом "безликого" массива Connections[]), и в любой момент времени, пока соединение существует, обращение к клиенту сводится к обращению к методам/св-вам объекта, ссылка на который будет храниться в стат.переменной

Иными словами

var SomeClient: TServerClientWinSocket; //стат.переменная
...

procedure TMyForm.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
SomeClient := TServerClientWinSocket(Socket); //сохранили ссылку на объект
end;

...
// обращаемся к клиенту, ссылка на которого хранится в стат.переменной

SendResult := SomeClient.SendText(...);


 
dimich1978 ©   (2003-02-27 12:07) [9]

Так давайте разберемся.
Перво наперво я думаю надо все ссылки на объект все же хранить в массиве.
И отсылать определенному клиенту использую именно этот массив.
Но я как понимаю вместе с сылкой на объект все же еще надо хранить вспомогательные данные (или имя компа, или IP , которое при коннекте сообщает комп клиента).
Таким вот образом мы получаем минимум пересылаемых данных по сети.



 
Digitman ©   (2003-02-27 12:31) [10]


> dimich1978


да по бабарабану - в переменной, в массиве или еще где-то !)
храни где хочешь или не храни вообще - суть от этого не изменна : в момент коннекта создается отдельный экз-р объекта TServerClientWinSocket, в момент дисконнекта объект этот уничтожается, и все то время, пока соединение активно, ссылка на этот экземпляр содержится как один из эл-тов списка Connections[]

это уже проблемы программиста - получив от компонента TServerSocket тем или иным образом в тот или иной момент ссылку на экз-р объекта (ассоциированного с индивидуальным кл.соединением), идентифицировать того же клиента по каким-то иным удобным признакам



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
3-67107
Ihtiandr
2003-04-02 16:44
2003.04.21
delete в FastReport


1-67204
Gerge M
2003-04-02 18:28
2003.04.21
Ordinal types


9-67071
FlameHeap
2002-11-19 09:45
2003.04.21
Алгоритмы поиска ДЛИННЫХ путей


14-67441
[BAD]Angel
2003-04-04 21:25
2003.04.21
Как поменять IP-адресс?


1-67277
Алексей Глеб
2003-04-11 11:10
2003.04.21
DLL & TFrame