我正在编写的网络LIB需要通过TCP插座发送和接收消息。可以随时发送或接收消息,即应该作为完整的双工频道工作。

我能够使用两个线程来实现此类方案:主线程调用send()和一个专用线程大多在recv()调用中被阻止。

我的问题是:是否可以使用单个线程实现相同的方案? IE通过注册一些回调功能?

附带说明:我需要在C ++,Java和Python中实现此情况。

有帮助吗?

解决方案

是的,有可能。您需要使用允许多路复用I/O的API。在C/C ++和Python下,您可以使用select()和非块I/O,以便您唯一阻止您在select()中封锁的网络调用。还有Poll()和EPOLL()以及其他许多类似的API,可以使用不同程度的效率和便携性。爪哇有 非阻滞I/O API 还。

另一种可能性是使用异步I/O,您告诉OS开始I/O交易,并在完成操作后通知您(通过某种机制)。我不熟悉这种网络编程风格,因此我不会尝试提供详细信息。

其他提示

通常,库将通过在应用程序的主循环 /事件循环中提供接口来实现此操作。

例如,大多数单线线程网络使用应用程序都将具有阻塞的主循环 select(), poll() 或类似。您的库只会返回该应用程序应包含的文件描述符 select() / poll() 呼叫,以及该文件描述符可读取时,应用程序应呼叫的回调函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top