Ошибка Gsoap в C ++ - PullRequest
       42

Ошибка Gsoap в C ++

0 голосов
/ 20 сентября 2008

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

;
}

1 Ответ

1 голос
/ 20 сентября 2008

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

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

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

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

...