Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何使用单个线程通过TCP实现全双工通道?_Sockets_Tcp_Duplex_Single Threaded - Fatal编程技术网

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

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,这样您唯一阻塞

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

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

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


作为一个旁注:我需要在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()
调用中的文件描述符,以及应用程序应在该文件描述符可读时调用的回调函数