Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1319522934
И. Павел
2011-10-25 10:08
2012.02.12
Пропала палитра компонентов


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


15-1319661005
Юрий
2011-10-27 00:30
2012.02.12
С днем рождения ! 27 октября 2011 четверг


15-1319117051
OW
2011-10-20 17:24
2012.02.12
Вопрос по настройке портов.


15-1319659770
Kerk
2011-10-27 00:09
2012.02.12
Отчет о работе сервисов Google





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский