|
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
|
|
Нужна помощь с разделением отправления / получения сообщений сокета на потоки22.09.2011, 14:07. Показов 1988. Ответов 2
Метки нет (Все метки)
По совету от kolobok0 попробовал разделить прием и передачу данных от сокета на различные потоки, чтобы достичь асинхронности.
Но столкнулся с проблемами, которые не совсем понимаю как решить. Скажем я создал три объекта SOCK, RD, WR. SOCK создает сокет, инициализирует его и запускает поток, который отслеживает сообщения. в нем я создаю событие m_ConnectionEvent, отвечающее за FD_READ, FD_WRITE, FD_CLOSE. Кроме того я создаю событие m_ExitEvent для остановки потока. затем с помощью WSAWaitForMultipleEvents я слежу за этими двумя событиями. Объект RD должен отслеживать события FD_READ, но на прямую он не может этого делать, так как FD_READ привязан к сокету в SOCK. Т.е. я должен, например через SetEvent(hReadEvailable) просигналить потоку в RD, что надо прочитать буфер. Так ли это или есть другой способ ? Что касается WR (write), то тут я совсем не понимаю - в каком именно случае срабатывает событие FD_WRITE ? В данный момент я через вызов функции класса WR::Send копирую данные в буфер этого объекта и с помощью SetEvent(hWriteBuffEvailable) сообщаю потоку класса WR, что можно отсылать информацию. Но каким именно образом это связано с FD_WRITE так как после вызова send FD_WRITE не вызывается (в прочем как и до этого) ? Может мне кто-либо помочь осмыслить эту проблему ? (кстати kolobok0, ты обещал подбросить хорошую литерату на эту тему!)
0
|
|
| 22.09.2011, 14:07 | |
|
Ответы с готовыми решениями:
2
Размер буфера для получения данных из сокета Прослушка сокета и посылка сообщений по сокету |
|
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
|
|
| 22.09.2011, 17:49 | |
|
По поводу литературы - я помню. Как только буду рядом с книгами - запишу. Щаз в процессе перезда. Уж сорьки.
По коду.. Честно говоря немного не вьехал... --------- Постараюсь обрисовать суть...(это из одной реализации, нечто типа своего аля TCP на уровне UDP. Сокеты кажеться разные были - не буду врать щаз не помню) Поток приёма. Задача - слушать сокет. Как можно быстрее выбирать данные из сокета, минимум обработки, передача дальнейшей логике обработки пакетов(потока), анализ на шутдаун, захват памяти (может и не быть), снова на сокет. Поток передатчика (если такой имееться). Ожидаем данные из очереди. Подготовка транспортной инфы. Отослать. Освободить память (может и не быть). Ожидать далее из очереди. (вообщето в данной реализации в этой же нитке была вся логика гарантированного уровня доставки - аля TCP) --------- Возможны и другие реализации. Например (это другой случай. TCP уровень). Один и тот же вспомогательный поток отрабатывает как сенд так и ресив. Обычно применяеться при соединении точка-точка. Малти ожидание необходимо делать на хэндлере сокета и на синхро обьекте очереди передачи. Тогда из основного потока Вы добавляете в очередь передатчика, сигнализируете ему и бежите дальше (если работаете асинхронно). --------- вроде так. у Вас насколько я понял уровень TCP ? (круглый)
0
|
|
|
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
|
|
| 22.09.2011, 19:02 [ТС] | |
|
У меня действительно уровень TCP, при чем данная модель описывает поведение клиента подключенного к серверу.
Зачем тогда разделять на потоки ? Просто передача данных идет от одного потока определенного объекта в сторону сервиса, данные передаются переодически и главное момент передачи данных не должен задерживать отвравляющий поток. А прием данных предназначен для другого потока, которому после приема я делаю Notify (вызываю callback функцию, которая поднимает флаг события в том объекте). То есть фактически на данный момент у меня есть три потока (для сокета) которые обслуживают еще два потока. Может быть выглядит и громоздко, но я пока не понимаю, как можно упростить с одной стороны и добиться асинхронности с другой. А на счет FD_WRITE я так и не понял, как же он работает?
0
|
|
| 22.09.2011, 19:02 | |
|
Помогаю со студенческими работами здесь
3
Проверка очереди получения сообщений в TCP
Потоки и очередь сообщений Ваша реализация получения сообщений по определенному протоколу Как работать с POP3 для получения сообщений с сервера? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|