gpt4 book ai didi

python - 防止其他应用程序将端口设置为 "stolen"

转载 作者:IT王子 更新时间:2023-10-29 00:35:18 27 4
gpt4 key购买 nike

我有一个类似守护进程的小型应用程序,它在特定端口上监听,但碰巧不同的应用程序使用相同的端口,以某种方式将其从我的应用程序中夺走。

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

同样有趣的是,当我在干扰应用程序已经运行时重新启动守护程序时甚至没有出现异常,它可以创建、绑定(bind)和监听该端口,它根本无法正常工作。

这里是主循环代码:

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

最佳答案

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

关于python - 防止其他应用程序将端口设置为 "stolen",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436754/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com