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

Вниз

recv() с таймаутом   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2011-10-30 20:15) [0]

Добрался до знакомства с WinSock. Потребовалось реализовать recv() на блокирующем сокете с таймаутом.

По сути, реализую свой прикладной протокол поверх TCP. Есть клиент, есть сервер. Клиент подключается к серверу, сервер в ответ отправляет сообщение с "приветствием". После этого по тому же соединению продолжается обмен другими сообщениями. Размер сообщений произвольный, в общем случае достаточно большой для того, чтобы однократный recv() не вычитывал их полностью. Заодно было бы интересно предусмотреть вариант, что "в следующих версиях" формат сообщений может изменяться. Весь обмен сообщениями с клиентской стороны инкапсулирован в моей же DLLке.

Соответственно, хочется реализовать recv(), которая бы работала не более заданного промежутка времени и вычитывала либо весь заданный объём данных, либо (если их много) сколько успеет.

1. Гугл предложил вариант с использованием select(). Смущает то, что придётся, кажется, вызывать его в цикле, при этом самостоятельно вычисляя для каждого вызова количество оставшегося времени. Не самое красивое решение, как мне кажется.
2. Крутить цикл без select() до завершения отведённого времени, вызывая recv() с MSG_PEEK - не лезет ни в какие ворота: пустая трата процессорного времени.
3. Создавать отдельные потоки и т.п. выглядит слишком громоздким.

Вопрос: насколько правильно я подхожу к организации взаимодействия и как лучше будет выполнять такое чтение?


 
Сергей М. ©   (2011-10-30 20:45) [1]

Блокирующий режим для такой цели явно не годится.


 
ProgRAMmer Dimonych ©   (2011-10-30 21:01) [2]

> [1] Сергей М. ©   (30.10.11 20:45)
> Блокирующий режим для такой цели явно не годится.

Хм, в общем виде, пожалуй, действительно нехорошо. Будет ли в таком случае хорошей идеей выполнять каждую пару "запрос-ответ" в отдельном потоке, а в вызываемой функции либо дожидаться завершения (если продолжение работы до окончания обмена невозможно), либо возвращать управление?

Речь, кстати, идёт о тонком клиенте.


 
Сергей М. ©   (2011-10-30 21:08) [3]

можно обойтись и без доп.треда, если отказаться от блок.режима в пользу неблокирующего (возможно с асинхронной нотификацией)


 
Slym ©   (2011-10-31 05:49) [4]

ProgRAMmer Dimonych ©   (30.10.11 20:15)
оответственно, хочется реализовать recv(), которая бы работала не более заданного промежутка времени и вычитывала либо весь заданный объём данных, либо (если их много) сколько успеет.

а зачем? цель этого промежутка времени? если пешеход не успел за 10 сек. перейти дорогу я не виноват?


 
Andruk   (2011-11-02 09:05) [5]

setsockopt (sd, SOL_SOCKET, SO_RCVTIMEO ....
Вам в помощь.


 
ProgRAMmer Dimonych ©   (2011-11-02 14:02) [6]

> [5] Andruk   (02.11.11 09:05)
> setsockopt (sd, SOL_SOCKET, SO_RCVTIMEO ....
> Вам в помощь.

Есть такое дело. Боюсь, правда, что при каждом чтении изменять свойства сокета, не слишком хорошо :(


 
Andruk   (2011-11-02 20:33) [7]


> Есть такое дело. Боюсь, правда, что при каждом чтении изменять
> свойства сокета, не слишком хорошо :(


Не кэшерно, или мама против? Шуткэ :)
Сокету точно все равно.


 
ProgRAMmer Dimonych ©   (2011-11-02 23:05) [8]

> [7] Andruk   (02.11.11 20:33)
> Не кэшерно, или мама против? Шуткэ :)
> Сокету точно все равно.

Хотя по-хорошему один раз при создании выставить будет достаточно, наверное.



Страницы: 1 вся ветка

Текущий архив: 2012.02.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1319661005
Юрий
2011-10-27 00:30
2012.02.12
С днем рождения ! 27 октября 2011 четверг


15-1319401805
Юрий
2011-10-24 00:30
2012.02.12
С днем рождения ! 24 октября 2011 понедельник


15-1319683450
brother
2011-10-27 06:44
2012.02.12
что означает %5 в поле POST запроса?


2-1320124854
Mach3
2011-11-01 08:20
2012.02.12
Дождаться выполнения скрипта.


2-1319994931
ProgRAMmer Dimonych
2011-10-30 20:15
2012.02.12
recv() с таймаутом