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

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

Сокеты в Делфи [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 : перед передачей собственно строки передавать ее ожидаемый размер в байтах


Наверх

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