gsoap 服务器程序内存泄漏问题

bj-alex 2018-03-07 08:28:02
UINT CTCOServerDlg::GsoapThread(void *param)
{
CTCOServerDlg *dlg = (CTCOServerDlg*)param;

soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);

//soap.send_timeout = 30; //
//soap.recv_timeout = 30;
soap.accept_timeout = 300; //连接超时 300s
soap.max_keep_alive = 100;
soap.keep_alive = TRUE;
soap.tcp_keep_alive = TRUE;


DWORD tid;
HANDLE hThread;

SOAP_SOCKET m, s;
m = soap_bind(&soap, NULL, 9999, BACKLOG);
if (!soap_valid_socket(m)){
dlg->WriteLog(_T("soap bind error!"));
}
else
dlg->WriteLog(_T("soap bind ok, Listening on port: 9999"));

for (;;) {

s = soap_accept(&soap);
if (!soap_valid_socket(s)) {
if (soap.errnum) {
soap_print_fault(&soap, stderr);
exit(1);
}

dlg->WriteLog(_T("server timed out"));
continue;
}

dlg->WriteLog(_T(" socket [%d] connect from IP: [%d.%d.%d.%d]"), s, (soap.ip >> 24) & 0xFF, (soap.ip >> 16) & 0xFF, (soap.ip >> 8) & 0xFF, soap.ip & 0xFF);

tsoap = soap_copy(&soap); // make a safe copy
if (!tsoap) break;


hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)process_request, tsoap, 0, &tid);
if (hThread == NULL) {
dlg->WriteLog(_T("can not create a thread for SOAP request processing.\n"));
exit(-1);
}


}

soap_done(&soap);
return 0;
}
/*************************************************************************************************************************************************************************/

DWORD WINAPI process_request(LPVOID* soap) {
((struct soap*)soap)->recv_timeout = 30; // Timeout after 30 second stall on recv
((struct soap*)soap)->send_timeout = 10; // Timeout after 10 second stall on send
soap_serve((struct soap*)soap);
soap_destroy((struct soap*)soap);
soap_end((struct soap*)soap);
soap_free((struct soap*)soap);

return 0;
}

int ns__exec(struct soap *soap, wstring in, wstring* out)
{

if (!soap->userid || !soap->passwd || strcmp(soap->userid, "ats") || strcmp(soap->passwd, "ats123"))
return 401;// HTTP authentication required
//执行函数
.......................
}


以上是我的服务器代码。主程序中有个线程调用GsoapThread(void *param)。windows7系统,两个客户端连接服务器。服务器通过XML格式回复客户端请求。
for循环内部建立的线程结束时,会调用 soap_destroy((struct soap*)soap);
soap_end((struct soap*)soap);
soap_free((struct soap*)soap); ,但是内存并没有完全释放。内次线程结束,内存都会增加十几K。不知道是不是我哪里使用不对。
...全文
573 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

8,909

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧