【问题标题】:C++ Windows IOCP - HTTP POST data missingC++ Windows IOCP - HTTP POST 数据丢失
【发布时间】:2010-04-23 13:21:09
【问题描述】:

我编写了一个非常简单的 IOCP HTTP 服务器,它适用于 GET 动词,但不适用于 POST。

我创建了一个套接字和一个监听线程,accept() 在其中等待连接。 当客户端连接时,我调用 ioctlsocket() 来解锁套接字,然后将套接字与 IOCP 关联,最后调用 WSARecv() 来读取数据。

确实读取了一些数据,当发生这种情况时,IOCP 通过 GetQueuedCompletionStatus() 唤醒一个工作线程,然后我恢复请求数据。

当我从任何浏览器发布时,我只会得到请求标头。有什么建议吗?

【问题讨论】:

    标签: c++ http iocp


    【解决方案1】:

    TCP 套接字上的所有读取都将返回 1 字节和发送总量之间的任意值,具体取决于您提供的缓冲区的缓冲区大小。可能发生的情况是,Web 服务器将数据作为两个单独的写入发送,而这恰好由服务器的 TCP 堆栈作为两个单独的数据块传输。您的读取正在完成,因为数据已到达。读取不会等到程序员期望的所有数据都到达,甚至不会等到缓冲区已满。

    网络问题可能会进一步混淆问题,因为路由器可能会分散数据,丢失的数据可能会在重新发送时延迟数据。

    始终在使用 TCP 时,您需要假设您的读取将始终只返回一个字节,并相应地进行编码;这样一来,事情总会奏效。

    您应该只发出另一个读取,当它到达时您将获得其余数据。

    你可能想看看我的免费 IOCP 服务器框架(它也有客户端),可以在 here 找到;听起来您已经有一些工作,但有时能够以不同的方式做事会有所帮助。

    当我需要在处理之前积累数据时,我倾向于采用以下方法。发出读取并等待它完成,看看我有什么,如果我没有得到我需要的一切并且我的缓冲区仍然有空间,请调整我正在使用的WSABUF,使其指向刚刚到达同一个缓冲区的当前数据结束并发出另一个读取;然后我们在同一个缓冲区中累积,直到我有足够的数据来处理它,或者我需要添加另一个缓冲区以获得更多数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多