0x01 解决方式
在Server端调用HttpWaitForDisconnect()
函数时,必须确保该函数的调用发生在HttpSendHttpResponse()
函数之前。
0x02 错误1229的官方解释
错误1229在WinError.h
中的定义如下
ERROR_CONNECTION_INVALID
1229 (0x4CD)
An operation was attempted on a nonexistent network connection.
由该解释联想到产生错误的几个可能原因:
- 连接已经不存在。
- 参数ConnectionId错误。
0x03 调试过程
排除连接已断开
通过netstat
命令查看网络连接,发现在HttpWaitForDisconnect()
发生错误后,客户端与服务端的连接仍然保持,于是排除第一个可能的错误原因。
确认ConnectionId正确
在一开始的调试中,首先确认了在HttpWaitForDisconnect()
函数中使用的ConnectionId
与接收到的HTTP_REQUEST
结构体中的ConnectionId
一致。
编写独立测试程序
独立编写的测试程序中HttpWaitForDisconnect()
运行正常,可以在连接断开时正常返回。
对比、调整调用失败的代码
对比成功调用的代码,对调用失败的代码进行不断调整,过程中发现当HttpWaitForDisconnect()
在HttpSendHttpResponse()
之前进行调用时,函数可正确运行。
0x04 猜测原因
由于无法查看WinHttp API
的实现代码,因此只能猜测原因如下:当HttpSendHttpResponse()
调用发生后,其对应的连接重新进入连接池,通过ConnectionID
无法对连接池中的连接进行访问,因此导致HttpWaitForDisconnect()
函数调用失败。
0x05 由该错误引出的使用注意
要在Server端创建子线程并在其中调用HttpWaitForDisconnect()
对某个HTTP_REQUEST
的连接进行状态监控时,一定要确保子线程中的HttpWaitForDisconnect()
已经切实运行后才能在主线程中对HTTP_REQUEST
进行处理