【问题标题】:Why does my web server sometimes only transmit part of the response?为什么我的网络服务器有时只传输部分响应?
【发布时间】:2012-08-19 19:39:32
【问题描述】:

我有一段定制的网络服务器代码。它是使用evnet module.编写的

当从远程客户端请求时,似乎缩短了消息的长度。但是当我在同一台机器上使用它时,它似乎传递了完整的信息。我无法弄清楚问题可能是什么或如何诊断它。我使用网络浏览器curlnc 对其进行了测试。从远程客户端请求时,它从未传递完整长度的消息。

Here's 我的网络服务器的简化版本仍然存在问题。我正在使用 Python 2.7.1 在 Ubuntu 11.04 上执行此操作

【问题讨论】:

  • 哎呀!我更正了我的问题,它实际上是我的网络服务器的代码。我没有任何自定义客户端。

标签: python linux network-programming webserver


【解决方案1】:

您在调用send() 发送一堆数据后立即关闭套接字。如果还有数据还在缓存,关闭socket时会被丢弃。

相反,您应该在套接字上调用shutdown(SHUT_WR) 来告诉远程端您已完成发送。这称为 TCP“半关闭”。作为响应,另一端将关闭其一侧,您将收到套接字不再可读的通知。然后,并且只有在那时,您才应该关闭套接字句柄。

【讨论】:

  • 我没有看到任何在线 evnet 文档,但如果它只是底层套接字之上的一层,这可能就是它没有发送整个内容的原因。您需要测试send 的结果以查看它发送了多少,并继续发送剩余的。而在接口127.0.0.1 上,它可能会发送整个内容。
  • @Greg @wberry send() 不是来自套接字,而是一个自定义函数,它反过来调用 evnet 模块的方法。它似乎确实会检查以确保在关闭之前发送所有数据,但我不确定。
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2020-07-16
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多