0

我最近正在处理网络编程(尤其是 P2P 系统)。我处理的常用程序在某个地方有这样的东西(在它自己的线程中运行):

while True:
    handle(receive())

如何处理一系列相关的发送/接收操作。例如,当我想要类似的东西时:

def inviteNode(receiver):
    send(receiver, INVITE)

    if receive() == OK:
        send(receiver, SOME_INFORMATION)
        ...

我的意思是几个相互依赖并具有一定顺序的发送/接收操作。有类似上面的东西会很好inviteNode()(因为协议的所有步骤都在代码中的同一位置,你可以通过查看代码来追溯顺序),但是receive()在我的监听循环之外调用只是赢了t 这样做,因为应该如何决定哪个receive()可以接收数据。

拥有全局状态是解决此问题的唯一方法吗?在做完第一个之后send(receiver, INVITE),我是否必须记住某个地方,我希望OK从那个特定的节点接收到一个,我刚刚发送INVITE到?当我有几个不同的这些相关的发送/接收操作时,这不是很复杂吗?

PS:只是为了确保:这是关于 UDP 连接的。

4

1 回答 1

0

似乎您需要使用套接字轮询。您可以使用 select() 系统调用(跨平台解决方案,但它不如使用特殊的系统相关 API 那样快),或者如果您的目标是 linux,您可以尝试使用 epoll API。

主要思想是:你有一些网络套接字,它们可以处于不同的状态(例如,可以接收数据)。

您可以查询此套接字集以获取某些事件(读取、写入、异常)并根据您的需要执行所需的操作。

例如,Nginx http 服务器就使用了这种架构。

此外,您还需要保存上下文,例如应该通知和检查哪些套接字,已经接收或发送了哪些数据,以及您可能需要的其他信息。

这有点复杂,但可以完成这项工作:有限状态机

于 2012-12-14T13:00:49.810 回答