Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Сокеты в Делфи   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
14-28258
deep.1
2002-11-17 22:31
2002.12.09
Люди, а кто нить знает о замене консоли под Вынь


3-27804
Andrew2
2002-11-21 05:31
2002.12.09
Как скопировать данные с одного сервера БД на другой ?


4-28344
Olgerd
2002-10-28 02:36
2002.12.09
Текст из Word а


14-28246
vopros
2002-11-18 11:22
2002.12.09
Порадуйте меня чем нибудь.


6-28177
AlexMain
2002-10-12 17:09
2002.12.09
Как получить МХ запись из DNS?