Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2011, 14:07
Ответы с готовыми решениями:

Умножение матриц с разделением на потоки
Здравствуйте! Пытаюсь написать программу, которая умножает матрицы, но с разделением на потоки. Вот, что получилось: #include...

Размер буфера для получения данных из сокета
Подскажите как изменить размер буфера для получения данных из сокета? делаю так: public string Read() { byte...

Прослушка сокета и посылка сообщений по сокету
Всем привет. Поставили задачу написать серверное приложение. Вот что есть: import socket import time import requests from bottle...

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2011, 19:02
Помогаю со студенческими работами здесь

Проверка очереди получения сообщений в TCP
Всем доброго времени суток! Подскажите, пожалуйста, ест ли какой нибудь метод в TCP, который проверяет очередь получения сообщений в TCP?...

WCF-чат логика получения сообщений
Всего пару недель как познакомился с WCF. На работе попросили создать чат (аналог ICQ), для клиента использую Windows Forms на сервере...

Потоки и очередь сообщений
Здравствуйте, форумчане. Есть необходимость в вашей помощи, натолкнуть на истину так сказать) В общем постановка задачи такая: есть...

Ваша реализация получения сообщений по определенному протоколу
Третьего дня получил задание - реализовать клиентскую часть одного сетевого протокольчика. Протокол простенький по своей спецификации, я...

Как работать с POP3 для получения сообщений с сервера?
???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Переходник 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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru