处理主侦听循环外的网络协议步骤

时间:2012-12-14 12:45:08

标签: networking udp

我最近正在处理网络编程(特别是P2P系统)。我处理的常用程序,某处有类似的东西(在它自己的线程中运行):

while True:
    handle(receive())

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

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

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

我指的是几个相互依赖并具有特定顺序的发送/接收动作。如上面的inviteNode()之类的东西会很好(因为协议的所有步骤都在代码中的相同位置,你可以通过查看代码来回溯顺序),但是{{1}我的监听循环之外的调用不会这样做,因为应该如何确定哪个receive()接收数据。

拥有全球州是唯一的解决方案吗?在完成第一个receive()之后,我必须记住某个地方,我希望从该特定节点收到send(receiver, INVITE),我刚刚发送了OK到?当我有几个不同的相关发送/接收动作时,这不是很复杂吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

例如,Nginx http服务器使用此架构。

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

这有点复杂但可以胜任:finite-state machines