Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мастера, подскажите


nt ©   (2002-04-23 13:02:00) 

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


Malder   (2002-04-23 16:47:00) [1]

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

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

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


Digitman   (2002-04-23 15:17:00) [2]

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


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

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


Malder   (2002-04-23 13:17:00) [4]

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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо