【发布时间】:2011-09-16 19:51:39
【问题描述】:
我有一个关于 TCP/IP 网络上的客户端套接字的问题。假设我使用
try:
comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(1)
try:
comSocket.bind(('', 5555))
comSocket.connect()
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(2)
创建的socket会绑定5555端口,问题是连接结束后
comSocket.shutdown(1)
comSocket.close()
使用wireshark,我看到socket被双方的FIN、ACK和ACK关闭了,我不能再使用这个端口了。我收到以下错误:
[ERROR] Address already in use
我想知道如何立即清除端口,以便下次我仍然可以使用同一个端口。
comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
setsockopt 似乎无法解决问题 谢谢!
【问题讨论】:
-
为什么客户端需要特定的端口?
-
因为我必须把它放到生产服务器中,并且在该服务器中,所有传出连接都被阻止。我需要为套接字指定一个特定端口,以便他们可以在防火墙上设置允许连接通过的规则。
-
您的网络管理员应该明白,出站流量可以由destination端口控制。
-
这有足够的信息。问题有 99% 的可能性是由
TIME_WAIT套接字状态引起的,下面的答案有一个解决方案:) -
你的操作系统是什么?你通常可以使用netstat查看套接字的状态(查找端口号以识别套接字)