Я пытаюсь пройти через джунгли сокетов и наткнулся на неблокирующие сокеты с перекрывающимся вводом / выводом. У меня дома три книги, которые только упоминают эту концепцию, но на самом деле не объясняют ее и не приводят мне примеров.
Итак, я ищу статью, в которой это объяснение объясняется примером или просто примером, через который я могу работать сам. Было бы хорошо, если бы это было для Windows, но я думаю, что я смогу перенести его и из Unix.
Я не возражаю против книги как источника, но я был бы рад избежать еще 50 $. До сих пор я нашел только очень базовую концепцию и базовые сравнения с другими моделями сокетов. Не то, чтобы я не понимал их концепцию, но я хотел бы увидеть их в действии и, возможно, получить хорошее объяснение того, как они работают. (Я вообще не против длинных статей :))
Фраза «неблокирующие сокеты» обычно относится к использованию опции сокета 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 () не масштабируется так же, как использование портов завершения ввода / вывода, но сначала освоитесь с первым.
Других решений пока нет …