首页 文章

如何使用单个线程在TCP上实现全双工通道?

提问于
浏览
3

我正在编写的网络库需要通过TCP套接字发送和接收消息 . 可以随时发送或接收消息,即应作为全双工信道 .

我能够使用两个线程来实现这样的场景:主线程调用send()和一个主要在recv()调用时阻塞的专用线程 .

我的问题是:是否可以用单个线程实现相同的场景?即通过注册一些回调函数?

作为旁注:我需要在C,Java和Python中实现这个场景 .

2 回答

  • 4

    是的,有可能 . 您需要使用允许多路复用I / O的API . 在C / C和Python下,您可以使用select()和非阻塞I / O,因此您阻止的唯一网络调用是select() . 还有poll()和epoll()以及许多其他类似的API,它们可以实现相同的效果,具有不同程度的效率和可移植性 . Java也有non-blocking I/O APIs .

    另一种可能性是使用异步I / O,您可以告诉操作系统启动I / O事务,并通知您(通过某种机制)何时完成操作 . 然而,我不熟悉那种网络编程风格,所以我不会试图提供细节 .

  • 0

    通常,库可以通过在应用程序的主循环/事件循环中提供接口来实现此目的 .

    例如,大多数使用单线程网络的应用程序都有一个主循环,可以阻止 select()poll() 或类似 . 您的库只返回应用程序应该包含在其 select() / poll() 调用中的文件描述符,以及应用程序在该文件描述符可读时应调用的回调函数 .

相关问题