質問
gsoap を使用して C++ で SOAP サーバーを作成しています。メッセージは Java で書かれたバスを通じてルーティングされます。サーバーとバスは両方ともマルチスレッドです。システムを通じて一度に 1 つのメッセージを送信することで、すべてがうまく機能します。3 つのクライアントを起動し、それぞれができるだけ早くメッセージを送信すると、約 3500 件のメッセージについては問題ありません。次に、定期的に「一度に許可される1つのソケット接続のみ」を受け取り始めます。 GSOAPコードからのエラー。通常、4,000 メッセージ中約 3,950 が 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構造体をコピーした後、 soap_copy()
, 、次のすべてを呼び出して解放する必要があると思います。
soap_destroy(x);
soap_end(x);
soap_free(x);
具体的には、失われた呼び出し soap_done()
(から呼び出されます) soap_free()
) 呼び出し soap_closesock()
, 、ソケットを閉じます。
所属していません StackOverflow