我有一个类似守护进程的小应用程序,它监听特定的端口,但是碰巧不同的应用程序使用相同的端口,不知何故将它从我的应用程序中移除。
在开始其他应用程序之前一切正常,一旦我启动它我不再获得连接,但在关闭它之后,守护程序继续工作。我不知道可以使用端口,而另一个应用程序正在监听它,并希望尽可能防止这种情况发生。
有趣的是,当干扰应用程序已经运行时重启守护进程时,甚至没有异常,它可以在该端口上创建,绑定和侦听,它根本不能正常工作。
这将是主循环代码:
if __name__ == '__main__':
print "Daemon PID:", os.getpid()
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(('localhost', local_port))
server.listen(10)
print "Server listening on:", server.getsockname()
while True:
thread.start_new_thread(handle_client, server.accept())
(local_port
和handle_client
是事先定义的,应该与问题无关,系统是Debian GNU / Linux 7,Python版本是2.7.3)
所要求的其他信息:
运行守护程序:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 25422/python
运行守护程序和VLC
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 25422/python
tcp6 0 0 :::9000 :::* LISTEN 25447/vlc
tcp6 0 0 ::1:9000 ::1:46156 ESTABLISHED 25447/vlc
tcp6 0 0 ::1:46157 ::1:9000 ESTABLISHED -
tcp6 0 0 ::1:46156 ::1:9000 ESTABLISHED -
tcp6 0 0 ::1:9000 ::1:46157 ESTABLISHED 25447/vlc
所以问题似乎是同时运行TCP和TCP6。还注意到,如果我第一次启动VLC,然后尝试运行我的守护进程,我确实得到了预期的错误,因为在这种情况下,VLC也会抓取TCP套接字。
答案 0 :(得分:2)
因此,您的守护程序仍在IPv4上运行,而VLC在IPv6上运行。如果尝试连接到它的应用程序只尝试IPv4,它将连接到守护进程;我猜这个应用程序首先尝试使用IPv6,而仅使用IPv4作为后备。您可以通过使用AF_INET6和'ip6-localhost'
打开IPv6端口而不是(或除此之外)守护程序中的IPv4端口来解决您的问题。