不管连接是被有意还是无意关闭,有时想始终在同一个端口上运行套接字服务器,如果客户端程序需要一直连接指定的服务器端口,这么做就很有用,因为无需改变服务器端口。
如果在某个端口上运行一个Python套接字服务器,连接一次之后便终止运行,就不能再使用这个端口了。如果再次连接,程序会抛出如下错误:
Traceback (most recent call last):
...
socket.error: [Errno 98] Address already in use
这个问题的解决方法是启用套接字重用选项SO_REUSEADDR。
创建套接字对象之后,可以查询地址重用的状态,比如说旧状态。然后,调用setsockopt()方法,修改地址重用状态的值。再按照常规的步骤,把套接字绑定到一个地址上,监听进入的客户端连接。在这个例子中,我们要捕获KeyboardInterrupt异常,这样按下Ctrl+C键后,Python脚本会终止运行,但不会显示任何异常消息。
import socket
import sys
def reuse_socket_addr():
sock = socket