防止港口被偷走"通过其他申请

时间:2014-05-02 20:52:16

标签: python linux sockets

我有一个类似守护进程的小应用程序,它监听特定的端口,但是碰巧不同的应用程序使用相同的端口,不知何故将它从我的应用程序中移除。

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

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

这将是主循环代码:

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_porthandle_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套接字。

1 个答案:

答案 0 :(得分:2)

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