Как реализовать полный дуплексный канал по TCP с помощью одного потока?

StackOverflow https://stackoverflow.com/questions/4675824

Вопрос

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

Я смог реализовать такой сценарий, используя два потока: основной поток вызов Send () и выделенный поток, в основном заблокированный при вызове recv ().

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

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

Это было полезно?

Решение

Да, это возможно. Вам нужно использовать API, который позволяет мультиплексированный ввод/вывод. Под C/C ++ и Python вы можете использовать Select () и не блокирующий ввод-вывод, так что единственный сетевой звонок, который вы когда-либо заблокировали IS Select (). Существует также опрос () и Epoll () и ряд других подобных API, которые выполняют то же самое, с различной степенью эффективности и мобильности. Ява имеет Не блокирующие APIS ввода/вывода также.

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top