Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 07:12   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос

Здравствуйте еще раз. Такой вопрос по компоненту TCPServer в режиме bmThreadBlocking. Функции отправки/приема данных синхронные. Т.е. если я вызываю в сокетном потоке ClientSocket.ReceiveLn;, то код не выполнится, пока в сокете не будут обнаружены данные.

Вопрос: как ограничить время ожидания приема/отправки данных? Т.е. к примеру, если втечение 110мс данные не приходят, то код выполняется дальше. Были задумки по поводу функций опроса сокета ClientSocket.WaitForData и ClientSocket.Select. Но они, как я понял, только для неблокирующих сокетов. Или я ошибаюсь??? Если вы сталкивался с подобным или знаете решение, буду очень благодарен.

В знак благодарности выложу пример сервера в многопоточном режиме, построенном на этом компоненте. Код весь отрабатываетс стабильно, но вот с таймаутом пока никак.

P.S. не предлагать использовать Indy или Synapse. В них то таймаут есть, но хочется на основе родных классов, ради принципа.

Заранее спасибо.

Тогда еще вопрос: winsock-функция recv сама по себе блокирующая? Т.е. вызвав, ее, поток остановится? Есть догадки, что recv не вернет управление, пока не поступят данные в сокет и не будут считаны.
"ковыряю изнутри" (с)

Последний раз редактировалось Stilet; 31.08.2010 в 07:25.
3D Hunter вне форума Ответить с цитированием
Старый 29.08.2010, 10:52   #2
theYozh
Пользователь
 
Аватар для theYozh
 
Регистрация: 28.01.2009
Сообщений: 75
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Тогда еще вопрос: winsock-функция recv сама по себе блокирующая? Т.е. вызвав, ее, поток остановится? Есть догадки, что recv не вернет управление, пока не поступят данные в сокет и не будут считаны.
если я правильно понял, то прием сообщений будет производиться в отдельном потоке. Сам так делал и могу сказать, что полной остановки потока происходить не будет потому, что recv - это функция, и в случае ошибки она просто вернет другой результат, а поток продолжит свою работу.

PS но на время выполнения функции recv поток естественно будет передавать управление ей.
theYozh вне форума Ответить с цитированием
Старый 31.08.2010, 07:21   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Спасибо за ответ! Тогда выход один - надо однозначно тестировать парсер на реальном оборудовании.

З.Ы. Да, сервер многопоточный, на блок. сокетах.

З.З.Ы. Как оттестирую парсер и все будет ок, выложу сюда исходный код. Если не забуду конечно. Кому будет нужно, пишите в личку, чтоб наверняка
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 04.09.2010, 07:57   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Ну вот, вчера успешно оттестировал парсер на реальных устройствах. Все работает, но есть одна неприятная особенность: при отключении устройства из списка программа ожидает приема следующего пакета и только после получения делает дисконнект. Т.е. recv все-таки может выполняться долго. Читал, что она может вернуть ноль, т.е. данных не пришло за определенный промежуток времени. Тогда вопрос: могу ли я сам определить для нее промежуток времени опроса?
Или я говорю ерунду и это заложено в самом винсоке? Спасибо
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 06.09.2010, 15:46   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

А скажите, на чем лучше реализовывать tcp-server - на Synapse или на Indy? В сунапсе свои библиотеки сокетов, от винсока он зависит косвенно ии вообще не зависит, насколько я понял.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 09.09.2010, 08:49   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Вот знаете, пришел к выводу, что либо тут все молчат от незнания, либо от великого ума, которого хватает, чтобы тем (не)знанием ни с кем не делиться. А может сокеты сейчас хлебное занятие, и поэтому все молчат, дабы кусок не перепал другому? А может с ними вообще никто не работает? Однако любят тут поститься в ламерские темы, отвечая на вопросы "а как загрузить длл", "как работать с указателями", "как программно создать кнопку" наконец. Ответов там пруд пруди. Во любители флудить! Я понимаю, что мне никто не обязан, но неужели никто не может ответить на несложный вопрос, разъяснив причины задержек recv'a send'a?
Тьфу, аж на душе противно. Ладно, уже неважно. Никого не хотел обидеть, говорил в общем. В любом случае тема закрыта.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UDP в сокетах HTL Работа с сетью в Delphi 2 02.04.2010 21:04
Переадресация на сокетах yres51447 Работа с сетью в Delphi 2 29.03.2010 15:01
Странный таймаут TidHTTP AXS Компоненты Delphi 0 12.10.2009 12:46
Таймаут и бесконечный цикл Terikon Работа с сетью в Delphi 4 30.03.2009 14:48