我对 socket 编程不太了解,并遇到一个令人困惑的问题:
我有一个 Windows 程序,但我不能更改它(专有软件),该程序尝试使用 tcp socket 连接到特定的 IP 地址和端口。
在我的 Linux 系统上,我编写了一个小的 Python 脚本来为 win 程序提供 socket 服务。这很好地工作,直到我杀掉 Linux 上的程序。初始服务器套接字没有按照规定关闭,直到套接字被垃圾收集了,我才能重新启动程序。
如果我在单独的 Python 脚本中尝试使用 Linux 套接字,则没有问题。
这是一个最简示例代码:
import socket
server = socket.socket()
server.bind(('192.168.0.111', 50001))
server.listen(1)
conn, addr = server.accept()
print 'Connection established'
running = True
while running:
try:
data = conn.recv(4096)
except KeyboardInterrupt:
conn.close()
running = False
else:
if data:
print data
else:
conn.close()
running = False
server.close()
如果我用Ctrl-C杀死它,它会正常退出。 但是重新启动脚本后,我会收到一个socket.error,指出地址已在使用中。一分钟左右后,程序又可以正常工作。我还尝试了关闭之前的关闭(即conn.shutdown(2)和server.shutdown ...),但没有任何效果。
有没有更好的“正确”关闭Windows套接字的方法? 我是否遗漏了套接字的一些基本知识?
谢谢!
编辑:我想我刚刚在这里看到了答案: what is the correct way to close a socket in python 2.6? 虽然我正在使用Python 2.5,但它可能仍然有效。
echo "disconnect" | nc 192.168.1.12 58888 -w 1
。 - user285594