Вопрос
Я использую gsoap для создания soap-сервера на C ++.Сообщения маршрутизируются через шину, написанную на Java.И сервер, и шина являются многопоточными.Все работает хорошо, отправляя через систему по одному сообщению за раз.Если я запущу 3 клиента, каждый из которых будет отправлять сообщения как можно быстрее, все будет нормально примерно для 3500 сообщений.Затем я начинаю периодически получать "Одновременно разрешено только одно подключение к сокету". ошибки из кода gsoap.Обычно около 3950 из 4000 сообщений проходят через OK.Со всеми 50 сбоями, произошедшими за последние 500 отправок.
Почему эти ошибки возникают после многих отправок, но не в начале отправки?Скорость отправки не увеличивается.
О чем это говорит?Я не могу найти никакого объяснения этой ошибке, и ее значение мне непонятно.
Кто-нибудь успешно запустил многопоточное приложение 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()
, который закрывает сокет.