C ++中的Gsoap错误
时间:2020-03-06 14:27:43 来源:igfitidea点击:
我正在使用gsoap在C ++中创建一个肥皂服务器。消息通过Java编写的总线进行路由。服务器和总线都是多线程的。一切正常,一次通过系统发送一条消息。如果我启动3个客户端,每个客户端都尽可能快地发送消息,那么对于大约3500条消息而言,一切都很好。然后,我开始定期接收"一次只允许一个套接字连接"。来自gsoap代码的错误。通常,大约4000条消息中的3950条可以通过OK。在最近的500个发送中发生了全部50个失败。
- 为什么这些错误会在多次发送后发生,而不是在发送开始时发生?发送速率不会增加。
- 在说什么我找不到该错误的任何解释,其含义也不清楚。
- 有人成功对gsoap应用程序进行了多线程处理吗?
这是我的服务器代码。
long WINAPI threadGO(soap *x);
int main(int argc, char* argv[])
{
HANDLE thread1;
int m, s; /* master and slave sockets */
struct soap *soap = soap_new();
if (argc < 2)
soap_serve(soap); /* serve as CGI application */
else
{
m = soap_bind(soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for (;;)
{
s = soap_accept(soap);
thread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadGO,soap_copy(soap),0,NULL);
}
}
soap_done(soap);
free(soap);
return 0;
}
long WINAPI threadGO(soap *x)
{
soap_serve(x);
soap_end(x);
return 0
;
}
解决方案
我相信我们在threadGO中存在资源泄漏。
用soap_copy()复制soap结构后,我相信需要通过调用以下全部来释放它:
soap_destroy(x); soap_end(x); soap_free(x);
具体来说,缺少对" soap_done()"的调用(从" soap_free()"中调用)会调用" soap_closesock()",从而关闭套接字。

