Неблокирующие розетки с перекрытием ввода / вывода

Я пытаюсь пройти через джунгли сокетов и наткнулся на неблокирующие сокеты с перекрывающимся вводом / выводом. У меня дома три книги, которые только упоминают эту концепцию, но на самом деле не объясняют ее и не приводят мне примеров.

Итак, я ищу статью, в которой это объяснение объясняется примером или просто примером, через который я могу работать сам. Было бы хорошо, если бы это было для Windows, но я думаю, что я смогу перенести его и из Unix.

Я не возражаю против книги как источника, но я был бы рад избежать еще 50 $. До сих пор я нашел только очень базовую концепцию и базовые сравнения с другими моделями сокетов. Не то, чтобы я не понимал их концепцию, но я хотел бы увидеть их в действии и, возможно, получить хорошее объяснение того, как они работают. (Я вообще не против длинных статей :))

3

Решение

Фраза «неблокирующие сокеты» обычно относится к использованию опции сокета FIONBIO, которая заставляет вызов read () немедленно возвращаться, даже если нет данных, готовых для чтения. (Возвращается с ошибкой EWOULDBLOCK.)

Перекрытый ввод-вывод является чем-то специфическим для Windows API (и не доступен, например, в UNIX). Опция сокета FIONBIO не не используются и традиционные вызовы API-функций сокетов Беркли (read () и т. д.).

(Для POSIX-эквивалента в Linux обратитесь к «man aio» или введите man aio в вашей любимой поисковой системе.)

Теперь, когда вы понимаете, что «неблокирующие сокеты» и «перекрывающийся ввод-вывод» — это два разных подхода (и их не следует смешивать), поиск полезных статей по каждому из них должен быть намного проще.

Документация MSDN о перекрывающихся операциях ввода-вывода на самом деле очень хорошая. Если вы занимаетесь программированием под Windows, вам действительно нужно использовать перекрывающийся ввод-вывод для всего, что имеет значение для производительности и масштабируемости. Вот хорошая отправная точка:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

(Эта статья MSDN о каналах, но она точно такая же, если использовать сокеты.)

Кроме того, имейте в виду, что WaitForMultipleObjects () не масштабируется так же, как использование портов завершения ввода / вывода, но сначала освоитесь с первым.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]