2008-09-19 3 views
0

Я использую gsoap для создания мыльного сервера на C++. Сообщения маршрутизируются через шину, написанную на Java. И сервер, и шина многопоточны. Все работает хорошо, отправляя одно сообщение за раз через систему. Если я запускаю 3 клиента, каждый из которых отправляет сообщения как можно быстрее, все нормально для примерно 3500 сообщений. Затем я начинаю получать периодические «Только одно соединение сокета разрешено за раз». ошибки из кода gsoap. Типично около 3950 из 4000 сообщений проходят через OK. При всех 50 неудачах происходит в последних 500 отправках.Ошибка Gsoap в C++

  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 

; 
} 

ответ

1

Я считаю, что у вас есть утечка ресурсов в threadGO.

После копирования мыла-структуры с soap_copy(), я считаю, что нужно освободить, вызвав все:

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

В частности, отсутствует вызов soap_done() (который вызывается из soap_free()) вызывает soap_closesock(), который закрывает гнездо.

 Смежные вопросы

  • Нет связанных вопросов^_^