Pergunta

Eu estou usando gsoap para criar um servidor de sabão em C ++. As mensagens são encaminhadas através de um barramento escrito em Java. Tanto o servidor quanto o ônibus são de vários segmentos. Tudo funciona bem envio de uma mensagem de cada vez através do sistema. Se eu começar 3 clientes cada envio de mensagens o mais rápido possível tudo o que é bom para cerca de 3500 mensagens. Então eu começar a receber periódica "Apenas uma conexão de soquete permitido de cada vez." erros do código gsoap. Típico cerca de 3950 de 4000 mensagens de fazê-lo através OK. Com todos os 50 falhas acontecendo nos últimos 500 envia.

  1. Por que esses erros ocorrem depois de muitos envia, mas não no início do envio? A taxa de envio não aumenta.

  2. O que é que está falando? Não consigo encontrar qualquer explicação sobre o erro, e seu significado não é claro para mim.

  3. Qualquer um de vários segmentos com sucesso um aplicativo gsoap?

Aqui está o meu código do servidor.

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

;
}
Foi útil?

Solução

Eu acredito que você tem um vazamento de recursos em threadGO.

Depois de copiar a estrutura sabão com soap_copy(), eu acredito que precisa ser liberado chamando todos:

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

Especificamente, a chamada falta para soap_done() (que é chamado de soap_free()) chama soap_closesock(), que fecha o soquete.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top