【问题标题】:Detecting graceful shut downs of sockets in python检测python中套接字的正常关闭
【发布时间】:2011-07-06 00:33:32
【问题描述】:

我正在尝试确定服务器套接字是否在 python 中正常关闭。

程序接收到文件,如果在发送过程中出现错误,应该删除文件。

我知道您的第一个建议是让客户端发送文件长度或一些终止数据,以让服务器知道文件传输已完成。
可悲的是,我无法更改客户端,它只是通过原始 tcp 转储文件,对此我无能为力。所以请不要,“但如果你能改变它”或“你的协议有缺陷”,我没有写协议,我将不得不处理它。

该脚本应该在 OSX 和 linux 上都可以运行,因此 epoll 已退出。

有什么建议吗?

我可以补充一点,我不关心发生了什么错误,只要发生任何错误。

【问题讨论】:

  • 捕获网络级异常没有帮助吗?
  • 通过报告文件结束来优雅地关闭套接字。您还需要了解什么?
  • 是的,但是我怎么读...
  • @Nicklas A. 你没有“阅读”那个。当您尝试对已关闭的套接字进行读取时,会引发异常。您实际检测到异常时遇到了什么实际问题?
  • 永远不会抛出异常,至少在 socket.recv 中不会

标签: python sockets serversocket


【解决方案1】:

如果另一端已经完成发送数据,他们应该关闭(2)套接字进行写入。然后在您的多路复用循环中,您将能够检查套接字是否已关闭以进行写入或刚刚被远程端关闭(写入和读取)。这是一个优雅的关闭,您可以使用 select/poll/kqueue 或其他方式。

如果客户端不这样做,不发送终止字符,也不发送长度或校验和,看起来很难。

您应该删除有关协议的更多详细信息,客户端是否仅出于发送文件的目的而打开 TCP 套接字?如果传输完成,它会关闭套接字吗?

在最坏的情况下,您必须检查文件的完整性,如果您知道它的格式,您可以尝试在运行时检查它或让 cron 选项卡进行清理。如果你不能,那么很难找到解决方案。祝你好运...

【讨论】:

  • 是的,socket被打开,文件被发送,然后socket被优雅地关闭。在 java 中,您只需关闭输出流并等待 read() 返回 -1
  • 如果出现网络错误或其他情况会怎样?我认为套接字也关闭了,没有办法说它是否优雅地关闭了。因此建议首先在套接字上使用 shutdown() 调用 WRITING 来通知另一端它已完成写入。请参阅 download.oracle.com/javase/1.4.2/docs/api/java/net/… 以了解 Java 中的正常关闭。
【解决方案2】:

事实证明,我需要做的只是将套接字超时设置为更低的值,比如 1 分钟,recv 调用将在 1 分钟后抛出异常。

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2017-05-03
    • 2015-07-20
    • 2011-06-29
    • 2014-03-01
    相关资源
    最近更新 更多