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