Как реализовать полнодуплексный канал через TCP с одним потоком? - PullRequest
3 голосов
/ 13 января 2011

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

Мне удалось реализовать такой сценарий, используя два потока: основной поток, вызывающий send (), и выделенный поток, в основном заблокированный в recv () call.

Мой вопрос: возможно ли реализовать один и тот же сценарий с помощью одного потока?Т.е. путем регистрации некоторой функции обратного вызова?

В качестве примечания: мне нужно реализовать этот сценарий на C ++, Java и Python.

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Да, это возможно.Вам нужно использовать API, который позволяет мультиплексный ввод / вывод.В C / C ++ и Python вы можете использовать select () и неблокирующий ввод / вывод, так что единственный сетевой вызов, который вы когда-либо блокировали - это select ().Существует также poll () и epoll () и ряд других подобных API, которые выполняют одно и то же с различной степенью эффективности и переносимости.Java имеет также неблокирующие API ввода-вывода .

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

0 голосов
/ 13 января 2011

Как правило, библиотека делает это, предоставляя интерфейс в основной цикл / цикл событий приложения.

Например, большинство однопоточных приложений, использующих сеть, имеют основной цикл, который блокирует select(), poll() или аналогичный.Ваша библиотека просто вернет файловый дескриптор, который приложение должно включить в свой вызов select() / poll(), и функцию обратного вызова, которую приложение должно вызвать, когда этот файловый дескриптор доступен для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...