|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.09.2009, 10:47 | #1 |
Регистрация: 13.09.2009
Сообщений: 3
|
Сокеты: блокируемые или асинхронные?
Доброго времени суток!
Столкнулся с затруднением, решая простую задачу получения UDP-пакетов. Есть приложение (плагин - multithreaded dll), чья задача - прослушивать определенный порт, получая UDP-дейтаграммы. Когда родительский процесс завершается, он уведомляет предварительно мой плагин. Тот должен как можно быстрее вернуть управление - необязательно даже дожидаться завершения текущей операции чтения. Текущая реализация: блокируемый recv() в цикле, цикл крутится в отдельном потоке. По команде QuitListen() выполняю shutdown(), в потоке прослушки recv() возвращает -1, ошибка - Interrupted function call(10004), там же взводится событие SetEvent(). Получив это событие, метод QuitListen() возвращает управление основному потоку. Вариант, конечно, неудобоваримый - как минимум, не устраивает интервал 6 секунд между shutdown() и возвратом из recv(). В поисках решения много гуглил, но в результате цельной картины так и не сложилось. Читал о трех решениях: 1) неблокируемые сокеты и постоянный опрос - не рекомендовано 2) блокируемые? сокеты и select() - так и не нашел подходящего примера кода 3) неблокируемые сокеты и...? Буду признателен за любую помощь в вопросе, желательно - с отсылкой к примеру. Спасибо заранее. Последний раз редактировалось AndreySt; 14.09.2009 в 10:51. |
14.09.2009, 13:26 | #2 |
Регистрация: 13.09.2009
Сообщений: 3
|
Поменял shutdown на closesocket - закрывает сразу, получаю ту же ошибку 10004 и выхожу из цикла. Все ж - некрасиво.
|
14.09.2009, 16:24 | #3 |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
Итак, два варианта:
1. У вас Виста, тогда вам подойдут асинхронные сокеты и функция WSAPoll. WSAPoll на MSDN 2. У вас Не Виста. Вам подойдет - асинхронные сокеты и select. Пример: Заголовочный файл Код:
Код:
|
14.09.2009, 17:00 | #4 |
Регистрация: 13.09.2009
Сообщений: 3
|
MaTBeu, спасибо. Буду пробовать асинхронные сокеты + select(). Здесь вы имеете в виду опрос состояния сокета select-ом и получение данных recv, когда в нем что-то есть, или есть еще варианты? P.S. Давно не кодил на C++ - трудно сообразить, как воспользоваться классом SocketSelect из вашего примера. Последний раз редактировалось AndreySt; 14.09.2009 в 17:03. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сокеты | SL1CK | Общие вопросы C/C++ | 8 | 05.10.2009 13:20 |
Сокеты | IICuX123 | Общие вопросы .NET | 6 | 27.07.2009 01:27 |
Сокеты | Raz0r | Помощь студентам | 2 | 29.04.2009 14:47 |
Открытые сокеты или перманентные запросы | Квэнди | Свободное общение | 4 | 30.01.2008 21:18 |
сокеты | cross | Работа с сетью в Delphi | 2 | 21.12.2006 18:12 |