質問

gsoap を使用して C++ で SOAP サーバーを作成しています。メッセージは Java で書かれたバスを通じてルーティングされます。サーバーとバスは両方ともマルチスレッドです。システムを通じて一度に 1 つのメッセージを送信することで、すべてがうまく機能します。3 つのクライアントを起動し、それぞれができるだけ早くメッセージを送信すると、約 3500 件のメッセージについては問題ありません。次に、定期的に「一度に許可される1つのソケット接続のみ」を受け取り始めます。 GSOAPコードからのエラー。通常、4,000 メッセージ中約 3,950 が 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

;
}
役に立ちましたか?

解決

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

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

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

具体的には、失われた呼び出し soap_done() (から呼び出されます) soap_free()) 呼び出し soap_closesock(), 、ソケットを閉じます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top