Форум: "Сети";
Текущий архив: 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.46 MB
Время: 0.004 c