HP-Socket icon indicating copy to clipboard operation
HP-Socket copied to clipboard

关于HttpServer中的IsKeepAlive()有点问题

Open BeeBiu opened this issue 3 months ago • 3 comments

抱歉,不小心按错了,https://github.com/ldcsaa/HP-Socket/issues/315,点到close,重新发了一个

` template<class T, USHORT default_port> BOOL CHttpServerT<T, default_port>::SendResponse(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc, const THeader lpHeaders[], int iHeaderCount, const BYTE* pData, int iLength) { WSABUF szBuffer[2]; CStringA strHeader;

::MakeStatusLine(m_enLocalVersion, usStatusCode, lpszDesc, strHeader);
::MakeHeaderLines(lpHeaders, iHeaderCount, nullptr, iLength, FALSE, IsKeepAlive(dwConnID), nullptr, 0, strHeader);
::MakeHttpPacket(strHeader, pData, iLength, szBuffer);

return SendPackets(dwConnID, szBuffer, 2);

} ` 我查看了 HP-Socket/Windows/Src/HttpServer.cpp的源码,发现MakeHeaderLines( IsKeepAlive(dwConnID), ); 处是用IsKeepAlive()检测的

但我测试发现这个值只能在比如OnHeadersComplete这类事件内部用,测试取出来的值是对的,事件外取出来的值是不同的(http1.0永远false,http1.1永远true)

因为我在OnHeadersComplete中把任务提交到另一个线程池里处理,处理完成后pSender->SendResponse回复请求时发现不管Connection带不带keep-alive值永远是close,然后我自己手动加了响应头才对,找到了半天才发现是IsKeepAlive()检测的值只能在事件内用,我想问一下这就是这么设计的吗,还是说httpserver再弄一个线程池来处理任务的方向就是错的,而是在OnHeadersComplete事件里处理,求解答


还有一个问题,我用Apache自带的测试程序,测试了官方自带的demo也是出现疑似内存泄漏的情况,Windows\Demo\TestEcho-Http是用vs2019编译的,之前一直以为是自己写的代码问题,内存占用随着测试次数的增加会随机一直增加,如图所示,等几小时也不会释放,不知是哪里出问题了

Image

BeeBiu avatar Sep 01 '25 09:09 BeeBiu

1、通常是解析完HTTP请求头,接收完Body内容,在OnMessageComplete事件用工作线程处理后续业务逻辑。但理论上只要连接没关闭,IsKeepAlive() 值是不会变的。 2、旧版本HP采用被动释放内存方式,等请求量降低后会逐渐释放内存,如果请求突然停止了,就不会释放内存。最新版本会主动定时释放内存, 即使请求突然停止,内存也会慢慢释放。

ldcsaa avatar Sep 13 '25 17:09 ldcsaa

@ldcsaa 1、对,我就是这么用的,然后在线程里调用 IsKeepAlive() 即使链接未关闭,发现取出来的值就是和事件内调用取出来的结果不同 2、截图的demo就是6.0.4版本的,还是会增加不会释放,你看图片,今天我重新编译跑测试直到内存增加后放了1个多小时没动都是占用那么多内存,不会降低

Image

Image

BeeBiu avatar Sep 17 '25 11:09 BeeBiu

1、看看OnMessageComplete事件中keepAlive的值是否变了。不行就只等手工处理。 2、断开连接才会释放内存。另外,内存占用可能和Sever Demo程序有关。

ldcsaa avatar Sep 25 '25 13:09 ldcsaa