Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-28329
Алексей Ким
2002-10-23 18:05
2002.12.09
on top


14-28267
VEG
2002-11-18 20:47
2002.12.09
Наш любимый чат...


1-28023
avsh
2002-11-27 19:24
2002.12.09
Динамические массивы


3-27883
Maxval
2002-11-21 13:37
2002.12.09
Как сделать чтобы в Query.SQL вставлялась дата и время?


14-28279
Cr@sh
2002-11-19 14:21
2002.12.09
Подскажите с чего начать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский