多个程序可以使用相同的UDP端口吗?
我现在有一个小的Python脚本,用来启动多个可执行文件(语音聊天服务器)。在下一个版本的软件中,这些服务器可以在UDP端口上接收心跳信号。(可能在一台机器上会有成千上万的服务器,端口号从7878开始往上。)
我遇到的问题是,这些服务器可能(也就是说,肯定会)和我的Python脚本在同一台机器上运行。我原本打算打开一个UDP端口,发送心跳信号,等待回复,然后就可以了……如果服务器没有响应,我可以通过结束任务并重新加载服务器来重启它。
问题是,我不能打开一个已经被服务器使用的UDP端口。有没有什么办法可以解决这个问题?项目负责人还是在实施心跳系统,所以我相信任何关于如何实现心跳系统的建议都是受欢迎的。不过,这个脚本是比较通用的,可能也适用于其他程序,所以我主要还是关注如何在那个UDP端口上进行通信。
2 个回答
1
我很确定在Linux上这是可以做到的;至于其他UNIX系统,我就不太清楚了。
有两种方法可以把文件描述符从一个进程传递到另一个进程:
- 当一个进程使用fork()创建子进程时,子进程会继承父进程的所有文件描述符。
- 一个进程可以通过“UNIX域套接字”把文件描述符发送给另一个进程。可以看看sendmsg()和recvmsg()这两个函数。在Python中,
_multiprocessing
这个扩展模块可以帮你做到这一点;具体可以参考_multiprocessing.sendfd()
和_multiprocessing.recvfd()
。
我还没有尝试过多个进程同时监听UDP套接字。不过在Linux上,对于TCP来说,如果多个进程都在监听同一个TCP套接字,当有连接请求进来时,会随机选择其中一个进程来处理。所以我猜Linux在多个进程同时监听同一个UDP套接字时,也会做一些合理的处理。
试试看,然后告诉我们结果吧!
2
这件事是做不到的。你需要有一个主程序来处理所有的UDP通信,这个主程序会通过一个端口来进行交流。然后,它再用其他方式和你的服务器沟通,比如在不同的端口上使用UDP,或者使用命名管道等等。