Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2014, 13:52   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию Асинхронные сокеты на Windows и Linux, разница между ними

Прив. Пишу сервер, и он же должен быть асинхронным, потому что это круто и так надо.
С обычными сокетами все ясно, просто вызываешь sent и recv и прога ждет, пока данные отправятся или придут на сокет.
Но как быть с асинхронными?
Я прочитал, что сама ОС Виндовс построена на событиях. И для полноценного использования всех радостей асинхронных сокетов надо бы создать окошко используя WinMain и привязать к функции-обработчику окна свои методы, которые будут вызываться при поступлении на сокет данных и т.д. Но ведь на сервере окошко не нужно, это меня как-то огорчает.
А вот как быть с линуксом? Как там работать с асинхронными сокетами, ведь Линукс - это не Виндовс.
Можно ли особо не парясь писать код, который будет работать как на Виндовсе, так и на Линуксе?
lawliet93 вне форума Ответить с цитированием
Старый 09.10.2014, 14:24   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Я прочитал, что сама ОС Виндовс построена на событиях. И для полноценного использования всех радостей асинхронных сокетов надо бы создать окошко используя WinMain и привязать к функции-обработчику окна свои методы, которые будут вызываться при поступлении на сокет данных и т.д.
Ой, бред...
p51x вне форума Ответить с цитированием
Старый 09.10.2014, 14:29   #3
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ой, бред...
Тогда поясните, что не бред.
Цитата:
Асинхронное расширение Winsock оперирует отсылкой сообщений окну всякий раз, когда происходит смена состояния сокета
http://www.netcode.ru/cpp/?lang=&kat...176&artID=5158

Последний раз редактировалось lawliet93; 09.10.2014 в 14:43. Причина: опечаточка
lawliet93 вне форума Ответить с цитированием
Старый 09.10.2014, 15:21   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

И на Windows и на Linux можно использовать select(), но тогда все равно данные читаются как бы синхронно, но для сокетов это не важно, ибо объемы маленькие.

Для Windows есть IOCP. Суть в том, что запускается операция чтения/записи а сигнал приходит по завершении операции. Насколько я знаю, в Linux точного аналога нет. Самое близкое это epoll() но это больше похоже на select() способ - сообщает о наличии данных но само перебрасывание данных происходит синхронно.
waleri вне форума Ответить с цитированием
Старый 09.10.2014, 15:38   #5
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
И на Windows и на Linux можно использовать select(), но тогда все равно данные читаются как бы синхронно, но для сокетов это не важно, ибо объемы маленькие.

Для Windows есть IOCP. Суть в том, что запускается операция чтения/записи а сигнал приходит по завершении операции. Насколько я знаю, в Linux точного аналога нет. Самое близкое это epoll() но это больше похоже на select() способ - сообщает о наличии данных но само перебрасывание данных происходит синхронно.
так селект это фигня полная, я читал. Вместо него юзают WSAAsyncSelect
lawliet93 вне форума Ответить с цитированием
Старый 09.10.2014, 15:57   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну, может и фигня полная, зато можно не парясь писать код, который будет работать как на Виндовсе, так и на Линуксе.
waleri вне форума Ответить с цитированием
Старый 09.10.2014, 16:48   #7
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну, может и фигня полная, зато можно не парясь писать код, который будет работать как на Виндовсе, так и на Линуксе.
но непроизводительно же, там же вроде в вечном цикле проверяется состояние сокета, не?
lawliet93 вне форума Ответить с цитированием
Старый 09.10.2014, 16:50   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну вы определитесь уже что вам важнее - писать один код под обе платформы или извлекать максимум из каждой.

Если универсальность, тогда select().
Если скорость, тогда IOCP для Windows и epoll() для Linux.
waleri вне форума Ответить с цитированием
Старый 09.10.2014, 17:05   #9
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну вы определитесь уже что вам важнее - писать один код под обе платформы или извлекать максимум из каждой.

Если универсальность, тогда select().
Если скорость, тогда IOCP для Windows и epoll() для Linux.
да, я уже нашел штуку одну, называется Boost::asio, и вот там можно писать 1 код, но под линухом будет использоватся epoll, а потм виндусом iocp, ну или что там.
В общем - универсально и максимально полезно! лол
lawliet93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как "правильно" принимать данные используя асинхронные сокеты? lawliet93 C# (си шарп) 3 04.04.2014 13:59
Синхронные, асинхронные, блокирующие, неблокирующие сокеты RuVarez Win Api 5 23.03.2013 22:47
1 и 2 форма. Связь между ними. Roman1295 Общие вопросы Delphi 1 02.11.2012 17:15
Сокеты: блокируемые или асинхронные? AndreySt Win Api 4 14.09.2009 18:43
Ноты и интервалы между ними треч Помощь студентам 5 01.02.2008 02:39