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

Вниз

Мастера, подскажите   Найти похожие ветки 

 
nt   (2002-04-23 13:02) [0]

В TServerSocket
Если присоеденились несколько клиетов, и все шлют данные, то собыие OnRead срабатывает на каждый пришедший блок данных не важно от какого клиента? Если так, то как их можно раскидать?


 
Malder ©   (2002-04-23 13:17) [1]

Посмотри внимательно на объявление события:

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

В качестве параметра передается Socket - это именно тот сокет от которого пришли данные.
Соответственно, если в обработчике напишешь: Socket.ReceiveText - то это будет текст, пришедший именно от этого сокета.

Вне обработчика события ClientRead к нужному сокету можешь обратиться так: ServerSocket1.Socket.Connections[0] - где Connections - массив сокетов, нулевой элемент - это первый подключившийся и т.д.


 
nt   (2002-04-23 13:59) [2]

ок, спасибо.
То что блоки данных идут вперемешку, я уже проверил. Но как их потом раскидать? Т.е. чтобы у меня были указатели на память, где по такому-то адресу, лежат данные от первого клиента, по такому-то от второго клиента и т.д. И как узнать, что данные от определнного клиента уже полностью собраны? Есть же уже готовые решения. Не хотелось бы изобретать велосипед. Приведите плз.


 
Digitman ©   (2002-04-23 15:17) [3]

Тебе же объяснил <Malder> : параметр Socket в событии OnClientRead() однозначно идентифицирует клиентское соединение ! Разве этого недостаточно ?


 
Malder ©   (2002-04-23 16:47) [4]

nt, ты неправильно себе представляешь логику сетевых соединений. Ну глупый же вопрос "узнать, что данные от определнного клиента уже полностью собраны". Для сокета все равно что там передается. Есть только два состояния - подключено и отключено. В первом состоянии возможна передача данных, во втором нет. Еще TCP/IP гарантирует правильность доставки данных. Все. Остальное ложится на твои плечи. Можешь в качестве флага, что все данные переданы использовать специальные символы (какой-нибудь там код перевода строки). Как только встречается данный флаг - значит все данные (или порция данных) переданы и их можно обрабатывать.

Насчет "чтобы у меня были указатели на память, где по такому-то адресу, лежат данные от первого клиента, по такому-то от второго клиента и т.д. "
Данные ты можешь считывать методами socket.ReceiveBuf, socket.ReceiveText и т.д. А уж где их хранить - твое дело. Можешь создать массив строк, где, например, данные от ServerSocket1.Socket.Connections[0] будут храниться в ArrOfString[0] и т.д.
и как только данные от какого-то сокета будут полностью приняты (встретился служебный символ окончания данных) можно их обработать и опять накапливать в String информацию от сокета (если передаваемы данные - текст).
В простейшем случае все тело запроса придет одним текстом. Поэтому логига совсем простая. Принял данные, обработал, отправил ответ.

Если же тебя интересует реализация какого-то стандартного протокола, то почитай RFC - там все это подробно описано: какие разделители между сообщениями, какой формат передаваемых данных и т.д.



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

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

Наверх




Память: 0.48 MB
Время: 0.013 c
3-9695
Bocman
2002-06-10 17:25
2002.07.04
TQuery и TADOQuery


3-9741
McSimm
2002-06-12 12:54
2002.07.04
Кто поможет разгадать тайну кнопки


7-10027
der
2002-04-10 11:33
2002.07.04
печать напрямую на LPT.


1-9794
Sirus
2002-06-23 19:45
2002.07.04
Как распечатать HTML документ из TWebBrowser a????


7-10033
alexspb
2002-04-09 18:52
2002.07.04
Как узнать имя пользователя-владельца файла в WinNT?