2009-03-03 94 views
6

我最近一直在学习python,并且刚开始使用python的socket库进行网络连接。直到最近,当我的脚本终止而没有关闭连接时,一切都进行得很顺利。下一次我跑了剧本,我得到:Python端口绑定

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

如此看来,事情仍绑定到该端口,即使python脚本不运行(我已经使用$px aux验证了这一点什么。奇怪的是,一分钟左右后,我可以在同一个端口再次运行脚本,它会没事的。是否有任何方法来防止/解除端口,以便在将来发生这种情况?

回答

14

你想要什么要做的就是在bind之前,做:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

您看到您所处行为的原因是操作系统在最后一次连接终止后的一段时间内保留了该特定端口。这样可以正确地丢弃应用程序终止后可能进入的任何杂散的数据包。

通过设置SO_REUSEADDR套接字选项,您告诉操作系统,您知道自己在做什么,并且仍然希望绑定到相同的端口。

+1

此外,您可能需要在套接字上调用shutdown()和close()。 – 2009-03-03 23:09:20