0

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

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

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

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

4

1 回答 1

2

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

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

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

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

你可能想看看我的免费 IOCP 服务器框架(它也有客户端),可以在这里找到;听起来你已经让事情正常了,但有时能够看到不同的做事方式会有所帮助。

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

于 2010-04-23T15:54:34.843 回答