检测Python中套接字的优雅关闭
我想知道在Python中,服务器的套接字(socket)是否正常关闭。
这个程序是用来接收文件的,如果在发送过程中出现了错误,就应该把这个文件删除掉。
我知道你们可能会建议让我客户端发送文件的长度或者一些结束的数据,这样服务器就能知道文件传输完成了。
可惜的是,我不能更改客户端,它只是通过原始的TCP协议直接发送文件,我对此无能为力。所以请不要说“如果你能改的话”或者“你的协议有问题”,我并不是设计这个协议的人,只能接受现状。
这个脚本需要在OSX和Linux上都能运行,所以不能使用epoll。
有什么建议吗?
我可以补充一点,我不在乎具体发生了什么错误,只要有错误发生就行。
2 个回答
1
如果另一端已经完成了数据的发送,他们应该关闭(2)写入的套接字。这样在你的多路复用循环中,你就可以检查这个套接字是否已经关闭写入,或者是远程端已经完全关闭(包括读和写)。这是一种优雅的关闭方式,你可以使用select、poll、kqueue或者其他方法。
如果客户端不这样做,不发送结束字符,也不发送长度或校验和,那就会变得很麻烦。
你应该多提供一些关于协议的细节,比如客户端是否仅仅为了发送文件而打开了一个TCP套接字?如果传输完成,它是否会关闭这个套接字?
在最糟糕的情况下,你需要检查文件的完整性。如果你知道文件的格式,可以尝试在运行时检查,或者设置一个定时任务来清理。如果你无法做到这一点,那就很难找到解决方案。祝你好运……
0
结果发现,我只需要把套接字的超时时间设置得短一些,比如1分钟。这样的话,接收数据的调用在1分钟后就会抛出一个异常。