gpt4 book ai didi

C++ Windows IOCP - HTTP POST 数据丢失

转载 作者:行者123 更新时间:2023-11-28 03:57:51 25 4
gpt4 key购买 nike

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

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

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

当我从任何浏览器发布时,我只会得到请求 header 。关于原因有什么建议吗?

最佳答案

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

网络问题可能会进一步混淆事情,因为路由器可能会使事情变得碎片化,丢失的数据可能会在重新发送时延迟事情。

总是在使用 TCP 时,您需要假设您的读取总是每次只返回一个字节并相应地进行编码;这样事情就会一直有效。

您应该再发出一次读取,当数据到达时您将获得其余数据。

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

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

关于C++ Windows IOCP - HTTP POST 数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2698842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com