【问题标题】:server not able to read payload for a given HTTP POST服务器无法读取给定 HTTP POST 的有效负载
【发布时间】:2011-08-11 13:36:28
【问题描述】:

我有一个生成 HTTP POST 请求的客户端和一个读取客户端发送的数据的服务器(套接字服务器)。当我在服务器端执行读取操作时,服务器只读取如下所示的标头,而不读取客户端发送的有效负载。客户端正在发送大约 5KB 的有效负载,但服务器上套接字上的读取操作读取 70 个字节的数据(标头),尽管 Content-length 为 4731,如下所示。我正在使用 read/recv 系统调用来执行读取操作,有人能说出为什么 read/recv 系统调用无法读取有效负载吗? (服务器使用C编程语言实现)

由服务器读取(未读取有效负载)**

POST / HTTP/1.1

内容类型:test/html

主机:192.168.1.102:800

内容长度:4731

期望:100-继续

连接:保持活动状态


拍拍

【问题讨论】:

  • 如果没有看到您使用的实际代码,就不可能做任何比猜测更好的事情。因此,请发布您用于读取数据的代码。

标签: c network-programming


【解决方案1】:

您在这里缺少的是 TCP 套接字是一个 。当您从中读取时,您会收到最多您要求的字节数,这意味着内核的网络堆栈会复制缓冲区大小或到目前为止所有可用字节,以较小者为准。

底线是您需要循环读取 TCP 套接字。来自客户端的一次发送可能最终被服务器多次读取,反之亦然。

【讨论】:

    【解决方案2】:

    内容类型是“test”/html?

    【讨论】:

    • 老兄,这应该只是评论,而不是答案。
    【解决方案3】:

    客户端可能没有实际上是通过网络发送负载,因为它在发送负载之前等待您的服务器响应 100 状态(或者您的服务器响应417 或其他最终状态代码,在这种情况下它根本不会发送有效负载)。如果您的服务器看到它不理解的“Expect”标头,它应该返回 417 状态。它还可以决定理解 100-continue 并发送请求的 100 状态。

    如果确实是这种情况,那么客户端的行为也不正确,因为如果服务器在足够长的时间后没有响应,它最终还是应该发送有效负载(假设服务器太旧而无法正确处理“期望”标题)。

    详情请参阅RFC 2616,尤其是第 8.2.3 节。

    【讨论】:

      【解决方案4】:

      无法保证 Content-Length 准确无误。客户端可能实际上并未发送正文。

      要跟踪问题,WiresharkFiddler 等网络嗅探器非常有用。这样,您可以查看数据是否实际发送。 Wireshark 是一个通用的网络嗅探器,可以捕获它在网络上“看到”的所有流量。 Fiddler 专注于 HTTP 流量,因此如果发送的数据未被识别为 HTTP,它可能就没有那么有用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多