powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / модели Winsock
38 сообщений из 38, показаны все 2 страниц
модели Winsock
    #34469051
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы спросить, какие режимы (блокирующий или неблокирующий) и модели работы с сокетами удобнее использовать в Windows (использовать select, события). Хотелось бы, чтобы обмен не отъедал много процессорного времени. Как мне представляется при использовании блокирующего режима нельзя корректно завершить поток ожидания соединения (так как будет висеть на accept) и кроме того, процессорное время используется нерационально. Как по вашему эффектвно ли каждое соединение обрабатывать в отдельном потоке? Хотелось бы, чтобы используемая модель работы с сокетами была довольно простая,позволяла эффектвно использовать процессорное время и функции ввода вывода не вешали поток. Мне кажется, что модель WSAEventSelect является разумным компромиссом простоты реализации и эффективности ввода вывода. Хорошо было бы услышать мнение людей, работатющих с сокетами в Windows.
...
Рейтинг: 0 / 0
модели Winsock
    #34469119
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, зависит от задачи.

Так по деталам:
1. Есть сихронный (блокирующий, не блокирующий) и асинхронный режимы.
2. Любой из режимов не будет отъедать много процессорного времени, если с умом подходить.
3. Завершить корректно поток в блокирующем режиме? Не знаю, может быть. А может быть, есть способы "сброса" сокета.
4. В блокирующем режиме при ожидании чего-то процессорное время не исползуется.
5. Если соединений предпологается не много, то может и эффективно. Иначе можно подумать о менеджере выделения процессорного времени в потоке и дергать им переодически каждый коннект. Опять же зависит от задачи.
6. п.2 И зависит от задачи.
7. Евент селект, я так понимаю, асинхронный режим. В данном случае тоже прийдется решать проблемы одновременного доступа. Так что, на любителя.

Работаю в линах, но принципы ничем не отличаются (кроме WSAStartup, WSACleanup ;) ).
...
Рейтинг: 0 / 0
модели Winsock
    #34469195
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akhимхо, зависит от задачи.

Так по деталам:
1. Есть сихронный (блокирующий, не блокирующий) и асинхронный режимы.
2. Любой из режимов не будет отъедать много процессорного времени, если с умом подходить.
3. Завершить корректно поток в блокирующем режиме? Не знаю, может быть. А может быть, есть способы "сброса" сокета.
4. В блокирующем режиме при ожидании чего-то процессорное время не исползуется.
5. Если соединений предпологается не много, то может и эффективно. Иначе можно подумать о менеджере выделения процессорного времени в потоке и дергать им переодически каждый коннект. Опять же зависит от задачи.
6. п.2 И зависит от задачи.
7. Евент селект, я так понимаю, асинхронный режим. В данном случае тоже прийдется решать проблемы одновременного доступа. Так что, на любителя.

Работаю в линах, но принципы ничем не отличаются (кроме WSAStartup, WSACleanup ;) ).

А как ты работаешть с сокетами. Если я правильно понял, когда поток ждёт accept(), то он не отъедает процессорное время? А можно ли не висеть при соединении с сервером (на connect()) и какие модели кроме событий позволяеют это сделать?
...
Рейтинг: 0 / 0
модели Winsock
    #34469229
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005А как ты работаешть с сокетами. Если я правильно понял, когда поток ждёт accept(), то он не отъедает процессорное время? А можно ли не висеть при соединении с сервером (на connect()) и какие модели кроме событий позволяеют это сделать?

Я работаю в неблокирующем режиме.
Когда поток на ассепте, это все равночто на селекте, а селект, как известно это очень хороший idle для прочессора. Про connect() недавно обсуждали в форуме, сам с этим заморачивался, так что поищи. Ну, и есстественно не блокирующий режим, кроме событий, позволяет не весеть на конеекте.
...
Рейтинг: 0 / 0
модели Winsock
    #34469245
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
модели Winsock
    #34469269
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh[quot OLEG_2005]как известно это очень хороший idle для прочессора
А можно поподробнее об этом?
...
Рейтинг: 0 / 0
модели Winsock
    #34469326
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 Akh[quot OLEG_2005]как известно это очень хороший idle для прочессора
А можно поподробнее об этом?

SELECT(2) Linux Programmer’s Manual
...

ОПИСАНИЕ
...

Иногда select вызывается с пустыми наборами (всеми тремя), n равным нулю и непустым timeout для переносимой реализации
(portable) перехода в режим ожидания (sleep) на периоды с точностью более секунды.
...
...
Рейтинг: 0 / 0
модели Winsock
    #34469860
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh OLEG_2005 Akh[quot OLEG_2005]как известно это очень хороший idle для прочессора
А можно поподробнее об этом?

SELECT(2) Linux Programmer’s Manual
...

ОПИСАНИЕ
...

Иногда select вызывается с пустыми наборами (всеми тремя), n равным нулю и непустым timeout для переносимой реализации
(portable) перехода в режим ожидания (sleep) на периоды с точностью более секунды.
...


Может это справедливо только для Linux? По моему, в Windows один из трех параметров должен быть ненулевым.
...
Рейтинг: 0 / 0
модели Winsock
    #34469915
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 Akh
SELECT(2) Linux Programmer’s Manual
...

ОПИСАНИЕ
...

Иногда select вызывается с пустыми наборами (всеми тремя), n равным нулю и непустым timeout для переносимой реализации
(portable) перехода в режим ожидания (sleep) на периоды с точностью более секунды.
...


Может это справедливо только для Linux? По моему, в Windows один из трех параметров должен быть ненулевым.

Отмечено, же - перенасимая реализация. С чего ты взял, что в винде должен быть установлен хотябы один набор сокетов?
...
Рейтинг: 0 / 0
модели Winsock
    #34469937
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылку навскидку не вспомю (вроде MSDN). Не рекомендуется использовать select в качестве таймера в Windows
...
Рейтинг: 0 / 0
модели Winsock
    #34469962
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в принципе, это суть дела не меняет. Даже если connect() для блокирующих сокетов реализован как select() с последним парметром NULL, все равно он передает набор сокетов.
И при использовании неблокируещих сокетов с помощью селекта тоже необходимо отмечать набор.
...
Рейтинг: 0 / 0
модели Winsock
    #34470020
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не гарантируется ТОЧНОЕ время срабатывавания
это так, на всякий случай
...
Рейтинг: 0 / 0
модели Winsock
    #34470243
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh OLEG_2005 Akh
SELECT(2) Linux Programmer’s Manual
...

ОПИСАНИЕ
...

Иногда select вызывается с пустыми наборами (всеми тремя), n равным нулю и непустым timeout для переносимой реализации
(portable) перехода в режим ожидания (sleep) на периоды с точностью более секунды.
...


Может это справедливо только для Linux? По моему, в Windows один из трех параметров должен быть ненулевым.

Отмечено, же - перенасимая реализация. С чего ты взял, что в винде должен быть установлен хотябы один набор сокетов?

Из MSDN описание функции select:
Any two of the parameters, readfds, writefds, or exceptfds, can be given as null. At least one must be non-null, and any non-null descriptor set must contain at least one handle to a socket.
...
Рейтинг: 0 / 0
модели Winsock
    #34470660
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 Из MSDN описание функции select:
Any two of the parameters, readfds, writefds, or exceptfds, can be given as null. At least one must be non-null, and any non-null descriptor set must contain at least one handle to a socket.

А попробувать ?
Нет ничего неопровержимей факта :)
...
Рейтинг: 0 / 0
модели Winsock
    #34470795
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 Из MSDN описание функции select:
Any two of the parameters, readfds, writefds, or exceptfds, can be given as null. At least one must be non-null, and any non-null descriptor set must contain at least one handle to a socket.

А что мы селект без сокетов изучаем? Сокеты уже изучили? ;)
...
Рейтинг: 0 / 0
модели Winsock
    #34471604
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, с сокетами я работал. Испольльзовал блокирующий режим. Хотелось, чтобы никакие функции не тормозили поток и использовать более эффективную модель работы с сокетами. Интересует способ эффективной и не очень сложный способ работы с сокетами в Windows без блокирования работы потока. Сейчас хочу реализовать обмен с использованием объектом событий, которые переходят в свободное состояние при возникновении событий сокетов. Очень интересно узнать, как присутствующие работают с сокетами в Windows. Переносимость на другие платформы, я думая, сейчас не очень актуальна для меня.
...
Рейтинг: 0 / 0
модели Winsock
    #34471638
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если переносимость не интересует - посмотрите на AcceptEx, TransmitFile
...
Рейтинг: 0 / 0
модели Winsock
    #34471656
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Очень интересно узнать, как присутствующие работают с сокетами в Windows. Переносимость на другие платформы, я думая, сейчас не очень актуальна для меня.

socket() и иже с ними это Си. Если тебе не нравиться писать свои классы на это дело, то надо искать библиотеки/классы для винды или твоей среды.
...
Рейтинг: 0 / 0
модели Winsock
    #34471693
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно свой класс я и хочу написать, чтобы он эффективно работал с сокетами. Пишу я на Visual C++. Я скачал несколько классов с www.codeproject.com, но мне они не очень нравятся.
...
Рейтинг: 0 / 0
модели Winsock
    #34472772
Gomes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочешь высокую производительность - копай в сторону IOCP. Если устроит готовое решение, глянь библиотеку ProstoServer .
...
Рейтинг: 0 / 0
модели Winsock
    #34472935
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порты ввода-вывода - довольно сложная модель. Думаю для моей задачи это очень круто.
...
Рейтинг: 0 / 0
модели Winsock
    #34472977
Gomes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну дык заюзай библиотеку, там ничего сложного.
...
Рейтинг: 0 / 0
модели Winsock
    #34473257
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бесплатная версия библиотеки имеет ограничения, которые меня не устраивают. Да и хочется попробовать самому разобраться.
...
Рейтинг: 0 / 0
модели Winsock
    #34473294
Gomes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OLEG_2005Бесплатная версия библиотеки имеет ограничения, которые меня не устраивают.Чем же? Делаешь сервер на миллион пользователей? ;)

OLEG_2005Да и хочется попробовать самому разобраться.Это правильно. На codeproject.com есть несколько примеров по IOCP-серверам. Статья по пулу потоков: http://rsdn.ru/?article/baseserv/threadpool.xml
...
Рейтинг: 0 / 0
модели Winsock
    #34473385
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто мне хотелось бы использовать класс для доступа к TCP.
...
Рейтинг: 0 / 0
модели Winsock
    #34473396
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто мне хотелось бы использовать класс, имеющий удобный интерфейс для доступа к TCP. Например, например минимальный интерфейс с методами Start(), Stop() и перехватывать события примёма данных. Кстати интересно узнать, а кто как обрабатывает приём данных, читают по одному символу и обрабатывают событие чтения очередного символа или как-нибудь по другому?
...
Рейтинг: 0 / 0
модели Winsock
    #34473469
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, какую нагрузку вы хотите обслужить?

В любом случае. по байтам читать не следует.
...
Рейтинг: 0 / 0
модели Winsock
    #34473505
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Просто мне хотелось бы использовать класс, имеющий удобный интерфейс для доступа к TCP. Например, например минимальный интерфейс с методами Start(), Stop() и перехватывать события примёма данных. Кстати интересно узнать, а кто как обрабатывает приём данных, читают по одному символу и обрабатывают событие чтения очередного символа или как-нибудь по другому?

Если есть увереность, что два пакета в один не сольются, то читаю с заведомо большим размером.
Если такой уверености нет, то использую магическую последовательность (на битстаффинг пока положил ;)) для выделения пакетов из потока tcp.
...
Рейтинг: 0 / 0
модели Winsock
    #34473554
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заранее точно трудно предсказать нагрузку. Программа является одновременно TCP-клиентом - по TCP снимается данные с систем обработки данных (теоретических их может быть несколько) и сервером, обрабатывая запросы клиентских программ. Я думаю, вряд ли сервер будет обслуживать одновременно больше 10-20 соединений.
...
Рейтинг: 0 / 0
модели Winsock
    #34473576
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилСкажите, какую нагрузку вы хотите обслужить?

В любом случае. по байтам читать не следует.

А как читать принимаемые данные?
...
Рейтинг: 0 / 0
модели Winsock
    #34473600
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh OLEG_2005Просто мне хотелось бы использовать класс, имеющий удобный интерфейс для доступа к TCP. Например, например минимальный интерфейс с методами Start(), Stop() и перехватывать события примёма данных. Кстати интересно узнать, а кто как обрабатывает приём данных, читают по одному символу и обрабатывают событие чтения очередного символа или как-нибудь по другому?

Если есть увереность, что два пакета в один не сольются, то читаю с заведомо большим размером.
Если такой уверености нет, то использую магическую последовательность (на битстаффинг пока положил ;)) для выделения пакетов из потока tcp.

Не совсем понятно. Просто мне трудно представить ситуацию, когда можно быть уверенным, что два пакета в один не сольются.
...
Рейтинг: 0 / 0
модели Winsock
    #34473660
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Не совсем понятно. Просто мне трудно представить ситуацию, когда можно быть уверенным, что два пакета в один не сольются.

Ну, допустим звук валится с частотой 50 Гц.
...
Рейтинг: 0 / 0
модели Winsock
    #34479843
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятно, почему плохо читать данные побайтно? Допустим есть протокол, со стратовым и стоповым байтом, если читать данные по несколько байто, то сильно усложнится разбор пакетов.
Интересно узнать, как в этот случае обычно поступают?
...
Рейтинг: 0 / 0
модели Winsock
    #34479912
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Допустим есть протокол, со стратовым и стоповым байтом, если читать данные по несколько байто, то сильно усложнится разбор пакетов.
Интересно узнать, как в этот случае обычно поступают?

Как угодно:
1. Алгоритмы выделения сообщений.
2. Автомат потока данных.
...
...
Рейтинг: 0 / 0
модели Winsock
    #34480472
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh OLEG_2005Допустим есть протокол, со стратовым и стоповым байтом, если читать данные по несколько байто, то сильно усложнится разбор пакетов.
Интересно узнать, как в этот случае обычно поступают?

Как угодно:
1. Алгоритмы выделения сообщений.
2. Автомат потока данных.
...

Что вы подразумеваете под алгоритмом выделения сообщений и автоматом потоком данных?
Данные в этих случаях читаются побайтно или по несколько байт?
...
Рейтинг: 0 / 0
модели Winsock
    #34480504
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 Akh OLEG_2005Допустим есть протокол, со стратовым и стоповым байтом, если читать данные по несколько байто, то сильно усложнится разбор пакетов.
Интересно узнать, как в этот случае обычно поступают?

Как угодно:
1. Алгоритмы выделения сообщений.
2. Автомат потока данных.
...

Что вы подразумеваете под алгоритмом выделения сообщений и автоматом потоком данных?
Данные в этих случаях читаются побайтно или по несколько байт?

Накопление буферов, анализ результата, сохранение остатков.
Тоже самое, думаю, что вы предпологаете для побайтового чтения, за исключением того, что в чтении блоком, будет иммитация, побайтового чтения.
Передается блок данных.
...
Рейтинг: 0 / 0
модели Winsock
    #34480582
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под побайтовым чтением я понимаю чтение одного байта, анализ данного символа и добавление его в буфер (принимаемого пакета). Не совсем понятно, когда вы говорите об имитации побайтового чтения в чтении блока. Если читать блоком, то возможно прочитать сразу данные из нескольких пакетов.
...
Рейтинг: 0 / 0
модели Winsock
    #34480670
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Под побайтовым чтением я понимаю чтение одного байта, анализ данного символа и добавление его в буфер (принимаемого пакета). Не совсем понятно, когда вы говорите об имитации побайтового чтения в чтении блока. Если читать блоком, то возможно прочитать сразу данные из нескольких пакетов.

Ну, что тут не понятного? Ну допустим у вас есть функция, которая читает один байт из сокета. Ну, будет она читать не из сокета, а из некого класса, который будет читать блоком, если его буфер опустел. Или допустим у вас есть события, которые вызываются, когда приходит 1 байт. Тогда вы укажите другой обработчик, который будет в цикле дергать ваш для одного байта, передавая ему по очереди весь блок.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / модели Winsock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]