java - C++ 中的 Gsoap 错误

标签 java c++ soap gsoap

我正在使用 gsoap 在 C++ 中创建一个 soap 服务器。消息通过用 Java 编写的总线进行路由。服务器和总线都是多线程的。一切正常,一次通过系统发送一条消息。如果我启动 3 个客户端,每个客户端都尽可能快地发送消息,那么对于大约 3500 条消息,一切都很好。然后我开始定期收到“一次只允许一个套接字连接”。来自 gsoap 代码的错误。通常 4000 条消息中大约有 3950 条通过 OK。所有 50 次失败都发生在最后 500 次发送中。

  1. 为什么在多次发送后会出现这些错误,而不是在发送开始时出现?发送速率不增加。

  2. 它在说什么?我找不到错误的任何解释,我也不清楚它的含义。

  3. 有人成功地对 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(),它关闭套接字。

关于java - C++ 中的 Gsoap 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/105326/

相关文章:

java - Android ExoPlayer 已弃用,无法流式传输视频

c++ - python和C之间共享配置文件格式?

java - WeakReference#get() 什么时候开始返回 null?

java - 使用 lines() stream Lambda 但需要关闭

c++ - 自动循环和优化

php - 如何在 PHP 中忽略或检查 "SOAP-ERROR: Encoding: Violation of encoding rules"

c# - 如何从代理类中的 Web 服务响应中读取 http 响应 soap header

web-services - REST 或 SOAP 哪个更适合 Angular UI?

java - 在java中更改目录所有者

c++ - 手动递增和递减 boost::shared_ptr?