2010-04-23 72 views
0

我已经写了一个非常简单的IOCP HTTP服务器,它适用于GET动词,但不适用于POST。C++ Windows IOCP - 缺少HTTP POST数据

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

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

我从任何浏览器开始POST时,只会收到请求头。有什么建议,为什么?

回答

2

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

网络问题可能会进一步混淆事项,因为路由器可能会将事物分解,丢失数据可能会在发生问题时延迟。

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

您应该发出另一个读取,并在到达时获得其余的数据。

你可能想看看我的自由IOCP服务器框架,可以发现here(它的客户也是如此);这听起来像你已经有事情工作,但有时能够看到不同的做事方式有所帮助。

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