0

私はgsoapを使用してC++でsoapサーバーを作成しています。メッセージは、Javaで記述されたバスを介してルーティングされます。サーバーとバスの両方がマルチスレッド化されています。システムを介して一度に1つのメッセージを送信すると、すべてがうまく機能します。3つのクライアントを起動して、それぞれができるだけ速くメッセージを送信すると、約3500のメッセージですべてが正常になります。その後、定期的に「一度に1つのソケット接続のみが許可されます」という受信を開始します。gsoapコードからのエラー。通常、4000通のメッセージのうち約3950通がOKです。過去500回の送信で50回すべての障害が発生しました。

  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

;
}
4

1 に答える 1

1

threadGO でリソース リークが発生したと思います。

で soap 構造体をコピーした後soap_copy()、次のすべてを呼び出して解放する必要があると思います。

soap_destroy(x);
soap_end(x);
soap_free(x);

具体的には、欠落しているsoap_done()( から呼び出されるsoap_free()) への呼び出しが を呼び出しsoap_closesock()、ソケットを閉じます。

于 2008-09-20T04:40:47.977 に答える