【发布时间】:2011-06-29 18:08:32
【问题描述】:
我是套接字编程的新手,遇到了一个令人费解的问题:
我有一个无法更改的 Windows 程序(专有软件),但它尝试使用 tcp 套接字连接到特定的 IP 和端口。
在我的 linux 机器上,我编写了一个小的 python 脚本来为 win prog 提供套接字。这工作正常,直到我在 linux 上杀死我的 prog。初始服务器套接字未按指定关闭,在套接字被垃圾收集之前我无法重新启动程序。
如果我对 linux 套接字(在单独的 python 脚本中)尝试相同的操作,我没有问题。
这是一个最小的代码示例:
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- 从客户端你可以超时 1 秒,让服务器有自己的超时时间
标签: python windows linux sockets networking