Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизСокеты в Делфи Найти похожие ветки
← →
sen (2002-11-27 16:01) [0]Как обрабатывается socked.receivedtext ?
Допустим у клиента на событие client.read начинается разбор принятой строки. Если разбор достаточно долгий, а в это время в сокет приходит новый текст, что происходит? Дело в том, что строка разбирается неправильно. Кто может рассказать подробнее о процессе приема текста в сокетах.
Спасибо
← →
Digitman (2002-11-27 16:07) [1]
> Как обрабатывается socked.receivetext ?
Да как угодно) Все от твоей фантазии зависит.
> Если разбор достаточно долгий, а в это время в сокет приходит
> новый текст, что происходит?
Пришедший "текст" встанет в очередь на чтение тобой.
Когда завершишь текущий обработчик OnRead(), Winsock возбудит новое событие, если очередь чтения непуста
> Дело в том, что строка разбирается неправильно
Тобой разбирается - заметь)... Разбирай "правильно" - вопрос сам сабой отпадет
> процессе приема текста в сокетах
Если есть альтернатива, следует вообще избегать передачи строк заведомо неизвестной (для приемника) длины.
Альтернатива же проста как 2х2 : перед передачей собственно строки передавать ее ожидаемый размер в байтах
← →
Smithson (2002-11-27 16:09) [2]Для приема пиши отдельный процесс. Я бы даже сказал больше - лично я делаю в таком случае fork, но увы, в паскале такого нет.
← →
Digitman (2002-11-27 16:14) [3]>Smithson
> Для приема пиши отдельный процесс
Эт зачем еще ? Достаточно стартовать доп.код.поток для обработки потока принятых в OnRead() данных.
← →
Smithson (2002-11-27 16:18) [4]СорриЮ та же ошибка терминологии. Cледует читать Для приема пиши отдельный поток.
← →
Digitman (2002-11-27 16:23) [5]>Smithson
И даже не для "приема", а для "разбора" уже принятого фрагмента потока.
Прием - дело микросекундное, его можно вполне возложить и на обработчик OnRead(). А вот парсинг и исполнение запроса - штука как правило ресурсоемкая и длительная. И вот эту "штуку" как раз следует "запихивать" в доп.код.поток, дабы не "тормозить" осн.код.поток, занимающийся в дан.случае исключительно транспортными "делами"
← →
Smithson (2002-11-27 16:24) [6]То же не спорю. Просто такие вещи я обычно пишу на unix и на с, так что повторю еще раз - fork
← →
sen (2002-11-27 16:58) [7]Спасибо за ответы
В примере чата, приведенном здесь,
http://delphi.mastak.ru/articles/sockadv/index.html
у клиентов неправильно обрабатываются имена подключенных клиентов, если их число больше двух.
Связано ли это с особенностью работы сокетов либо с самим алгоритмом?
← →
Digitman (2002-11-27 17:05) [8]
> Связано ли это с особенностью работы сокетов либо с самим
> алгоритмом?
И с тем и с другим. Пример дерьмовей этого следует еще поискать)
Алгоритм OnRead() в этом примере совершенно не учитывает особенностей работы протокола TCP в условиях глоб.сети.
← →
Digitman (2002-11-27 17:16) [9]Ох уж этот <Карих Николай> !
Зас..л мозги многим начинающим с Thread.Synchronize(), а теперь еще, ничтоже сумняшеся, начал давать "советы" по "правильной работе" гнезд
Ну где , где там OnWrite() ???
← →
sen (2002-11-27 17:18) [10]Большое спасибо, теперь более понятно, еще один вопрос,
событие клиентдисконнект у сервера (
ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket) ) происходит только при отключении клиента или при подключении нового клиента также.
Из примера чата видно, что в обоих случаях.
← →
Digitman (2002-11-27 17:23) [11]данное событие возбуждается при КОРРЕКТНОМ отключении активного клиента (т.е. исключающем случай пьяного бульдозериста, порвавшего ковшом кабель).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c