Вопрос

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

  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