python – 防止端口被其他应用程序“窃取”

我有一个类似守护进程的小应用程序,它侦听特定端口,所以不同的应用程序使用相同的端口,不知何故将它从我的应用程序中取出.

在启动其他应用程序之前一切正常,一旦我启动它我不再获得连接,但在关闭它之后,守护程序继续工作.我不知道可以使用端口,而另一个应用程序正在监听它,并希望尽可能防止这种情况发生.

有趣的是,当干扰应用程序已经运行时重启守护进程时,甚至没有异常,它可以在该端口上创建,绑定和侦听,它根本不能正常工作.

这将是主循环代码:

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套接字.

最佳答案 因此,您的守护程序仍在IPv4上运行,而VLC在IPv6上运行.如果尝试连接到它的应用程序只尝试IPv4,它将连接到守护进程;我猜这个应用程序首先尝试使用IPv6,而仅使用IPv4作为后备.您可以通过使用AF_INET6和’ip6-localhost’打开IPv6端口而不是(或除此之外)守护程序中的IPv4端口来解决您的问题.

点赞