Форум: "Сети";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизКто есть кто? (TServerSocket) Найти похожие ветки
← →
Кодер (2003-07-30 20:54) [0]Разъясните, пожалуйста. Имеется такая ситуация: серверное приложение, использующее компонент TServerSocket, принимает пакеты посредством события OnClientRead. Как ведет себя этот компонент, если одновременно приходят пакеты с нескольких клиентских компов? Перемешиваются ли данные? (Пакеты длинной не более 100 байт) Как в этом случае серверу понять от кого что пришло? (Пакеты принимаются посредством ReceiveBuf) И еще вопросик: какую информацию в этом случае выдаст ReceiveLength? Общую длину всех пакетов?
В каком случае возникает событие OnClientWrite? После того как сервер послал какие-либо данные?
← →
Shurik (2003-07-30 22:25) [1]>пакеты в очередь
>не перемешиваются
А хрен его знает (я с модемом намучился). Впиндюрь в пару первых байт размер посылки и отсекай пакеты при помощи ReceiveBuf...
← →
ZZ (2003-07-31 00:53) [2]Я не знаю должны ли они перемешиваться, но при определенном везении это получается :)))
← →
Spawn (2003-07-31 07:47) [3]Чтобы понять от кого пришли данные достаточно, сделать так:
ServerSocketClientRead
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
if ServerSocket.Socket.Connections[i].SocketHandle=Socket.SocketHandle then
//Пришло сообщение от ServerSocket.Socket.Connection[i]
← →
Digitman (2003-07-31 08:36) [4]
> Как ведет себя этот компонент, если одновременно приходят
> пакеты с нескольких клиентских компов?
С т.з. прикладной обработки событий одновременно они "прийти" никак не могут. События On[Client]Read возникают строго последовательно для того кодового потока, в котором процедура-обработчик будет исполняться. В случае stNonBlocking это основной код.поток. События On[Client]Connect/Disconnect/Read/Write/Error() есть результат обработки оконных сообщений, посылаемых гнездом в спец-но организованное для этого невидимое окно. А оконные сообщения в одном и том же код.потоке обрабатываются последовательно.
> Перемешиваются ли данные?
Не перемешиваются.
> Как в этом случае серверу понять от кого что пришло?
"представитель" клиента на серверной стороне - параметр Socket : TCustomWinSocket процедуры обработки события OnClientRead(). От клиента , с которым ассоциировано объект-гнездо Socket в момент вызова обработчика, и пришло сообщение.
> какую информацию в этом случае выдаст ReceiveLength
остаточный размер данных, не более которого (!) можно прочитать в данный момент из буфера чтения гнезда, ассоциированного с клиентом, посылающим серверу поточные данные.
> В каком случае возникает событие OnClientWrite?
Событие извещает о доступности/незанятости (освобождении) буфера передачи гнезда Socket (2-й параметр)
Возникает однократно, сразу за событием On[Client]Connect, показывая готовность передатчика (буфер передачи свободен и готов к записи в него данных).
Возникает всякий раз при освобождении буфера после полного "выталкивания" его содержимого в вирт.канал связи с клиентом. О занятости буфера говорит результат -1 вызова SendBuf(), в этом случае следует повторить попытку записи в буфер, дождавшись очередного возникновения события On[Client]Write().
Событие On[Client]Write(), однократно возбужденное после установления коннекта, более никогда не возникнет за весь сеанс коннекта, если в дальнейшем ни один из вызываемых в сеансе SendBuf/SendText-методов не привел к результату -1 (т.е. не было ни одной ситуации с попыткой переполнения буфера передачи гнезда со стороны прикл.задачи).
← →
Кодер (2003-07-31 12:53) [5]To Digitman: А какое именно свойство Socket : TCustomWinSocket необходимо просматривать в событии OnClientRead, чтобы отправителя узнать? Или как посоветовал Spawn?
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
if ServerSocket.Socket.Connections[i].SocketHandle=Socket.SocketHandle then
//Пришло сообщение от ServerSocket.Socket.Connection[i]
← →
Digitman (2003-07-31 13:01) [6]
> Кодер
а что ты подразумеваешь под св-вом, которое идентифицирует отправителя ? что, с твоей т.з., его (отправителя) должно однозначно идентифицировать ?
← →
Digitman (2003-07-31 13:16) [7]и потом - зачем его "узнавать" ?
тебе нужно тут же ответить отправителю ?
ну так и отвечай ему тут же
Socket.SendBuf()/SendText()/SendStream() !)
← →
Кодер (2003-07-31 13:51) [8]
> Digitman
Нет, мне не нужно тут же ему отвечать. Необходимо, к примеру, вести некую статистику по каждому из клиентов. Хотя ведь из какого сокета пришел пакет однозначно не идентифицирует одного из подключенных клиентов. Да, извините, глупый был вопрос... Лучше скорее всего, чтобы клиент в пакет зашивал свой IP-адрес? Тогда он однозначно будет идентифицироваться на сервере.
← →
Кодер (2003-07-31 13:59) [9]
> Digitman
Хотя, как тогда узнать какое активное соединение соответсвует данному клиенту? Просто мне нужно будет послать некую инфу этому клиенту, но не сразу. Просто мне необходимо знать какое активное соединение соответсвует данному клиенту, чтобы потом поддерживать некое общение с этим клиентом.
← →
Digitman (2003-07-31 14:15) [10]
> Хотя ведь из какого сокета пришел пакет однозначно не идентифицирует
> одного из подключенных клиентов
ничего подобного) ... еще как идентифицирует !
с момента коннекта до момента дисконнекта клиента его "интересы" на сервере представляет один и тот же, уникальный среди всех проичих коннектов, едигнственный и индивидуальный для данного коннекта объект-гнездо, тот самый что фигурирует 2-м параметром во всех событиях сервера.
> Лучше скорее всего, чтобы клиент в пакет зашивал свой IP-адрес?
> Тогда он однозначно будет идентифицироваться на сервере.
Ни к чему это. У объекта Socket (того самого 2-го параметра) есть св-во RemoteAddress, чтение которого и дает инф-цию об IP-адресе данного клиента
Кр.того , все объекты-гнезда, представляющие отдельные соединения с отдельными клиентами, перед вызовом события OnClientConnect() помещаются в список ServerSocket.Socket.Connections[] и удаляются из этого списка сразу за возвратом из обработчика события OnClientDisconnect().
← →
Digitman (2003-07-31 14:21) [11]
> Digitman
даже и IP-адрес не нужен.
в любом обработчике любого события (кроме Accept()):
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
if ServerSocket.Socket.Connections[i] = Socket then..
//данный клиент фигурирует i-м в списке Connections[]
← →
Кодер (2003-07-31 15:58) [12]Спасибо!
← →
alexdbases (2003-08-01 10:53) [13]У Socket есть змаечательное свойство Data в него каждому можно присвоить скажем объект (это просто добавление .... так ответ полнее будет =) )
← →
Dmitry Smirnov (2003-08-01 16:13) [14]-> Socket есть змаечательное свойство Data в него каждому можно присвоить скажем объект (это просто добавление .... так ответ полнее будет =) )
Вот на это хотелось бы поподробнее. в какой момент и как присваивать DATA какое то значение? Пробовал в обработчике события onGetSocket, что то не выходит....
← →
Digitman (2003-08-01 16:36) [15]
> что то не выходит
входит... не выходит ... детский сад !)
где код ??
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.015 c