Sockets 如何使用单个线程通过TCP实现全双工通道?
我正在编写的网络库需要通过TCP套接字发送和接收消息。消息可以随时发送或接收,即应作为全双工信道工作 我能够使用两个线程实现这样的场景:主线程调用send()和一个专用线程(主要在recv()调用时阻塞) 我的问题是:是否可以用一个线程实现相同的场景?例如,通过注册一些回调函数Sockets 如何使用单个线程通过TCP实现全双工通道?,sockets,tcp,duplex,single-threaded,Sockets,Tcp,Duplex,Single Threaded,我正在编写的网络库需要通过TCP套接字发送和接收消息。消息可以随时发送或接收,即应作为全双工信道工作 我能够使用两个线程实现这样的场景:主线程调用send()和一个专用线程(主要在recv()调用时阻塞) 我的问题是:是否可以用一个线程实现相同的场景?例如,通过注册一些回调函数 作为一个旁注:我需要在C++、java和python中实现这个场景。 < P>是的,这是可能的。您需要使用一个允许多路I/O的API。在C/C++和Python下,您可以使用select()和非阻塞I/O,这样您唯一阻塞
作为一个旁注:我需要在C++、java和python中实现这个场景。
< P>是的,这是可能的。您需要使用一个允许多路I/O的API。在C/C++和Python下,您可以使用select()和非阻塞I/O,这样您唯一阻塞的网络调用就是select()。还有poll()和epoll()以及许多其他类似的API,它们以不同程度的效率和可移植性完成了相同的任务。Java也有另一种可能是使用异步I/O,在异步I/O中,您告诉操作系统启动一个I/O事务,它在完成操作时通知您(通过某种机制)。但是,我不熟悉这种类型的网络编程,因此我不会尝试给出详细信息。通常,库会通过向应用程序的主循环/事件循环提供接口来实现这一点 例如,大多数使用应用程序的单线程网络都会有一个主循环,它会阻塞
select()
、poll()
或类似内容。您的库将只返回应用程序应包含在其select()
/poll()
调用中的文件描述符,以及应用程序应在该文件描述符可读时调用的回调函数