Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
6-9939
nt
2002-04-23 13:02
2002.07.04
Мастера, подскажите


1-9903
Olya1
2002-06-22 23:05
2002.07.04
Как сделать форму модальной?


14-10015
VictorT
2002-06-03 18:06
2002.07.04
Бои в памяти


3-9698
yozhik
2002-06-08 17:08
2002.07.04
Запрет доступа


6-9954
Doom
2002-04-20 20:22
2002.07.04
Ну не получается по-нормальному проверить инет !!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский