Pergunta

Eu tenho um aplicativo C # que tem funcionado muito bem para vários anos. Ele se conecta através de um soquete TCP / IP a uma máquina que me envia execuções de comércio de ações.

Recentemente, eu tentei implementá-lo em algumas máquinas em um novo centro de dados que está atrás de um firewall de hardware, e eu comecei a ver alguns estranho dis-connects.

Quando uma desconexão acontece, em meu aplicativo (lado do cliente), não vejo nada de anormal, exceto que parada I receber dados sobre o soquete. confirma Wireshark que nenhum dado está atingindo o soquete e os meus da aplicação receber segmento está bloqueando na chamada Receber () quando eu paro no depurador. Os shows de soquete conforme estabelecido no netstat.

Mas do lado do servidor, parece que meu cliente está dis-conexão. Olhando para os seus registos, parece que a tomada na sua extremidade termina geralmente acima, quer com (nRecvd = -1, errno = 104) ou (nRecvd = 0, errno = 11). (104 é a conexão de reset by peer).

Os dis-Connect só parece acontecer após um período de in-atividade. Eu ter resolvido isso por enquanto através da implementação de um batimento cardíaco entre meu cliente e seu servidor que apenas envia uma mensagem curta a cada 20 segundos e recebe uma resposta. Isso fez com que os dis-connects a cair para 0 ao longo dos últimos dias.

Em primeiro lugar, eu descobri que o firewall hardware era o problema. Ele estava causando o soquete para um tempo depois em atividade. Mas a pessoa encarregada das reivindicações de firewall que o tempo limite para conecta nesta porta (8887) é 2160 minutos.

Estou executando o Windows Server 2003 e .NET 3.5. O servidor comércios é uma máquina linux (sles9 Eu acredito que eu não tenho certeza).

Algumas ideias sobre o que pode estar acontecendo? O que eu poderia fazer para depurar isso mais uma vez que eu não tenho qualquer acesso aos logs de firewall e sem possibilidade de alterar o código no servidor de comércio?

Obrigado, Mike

Foi útil?

Solução

O que você descreve é ??comum, e é comum para implementar uma pulsação para manter TCP soquetes vivo através de tais firewalls / gateways como você fez.

Esse hardware pode ter duras 2160 minutos o tempo limite (na minha experiência 20-30 minutos é embora mais comum), mas as ligações são geralmente caiu muito mais agressivamente se há qualquer tipo de carga. Esses firewalls têm recursos limitados, e quando eles precisam de mais acompanhamento de conexão que eles tendem a cair a mais antiga ligação rastreada sem qualquer atividade, independentemente do conjunto de tempo limite duro.

Se você quiser depurar este mais, vá fungada no lado do servidor do firewall e ver o que, se anyting, acontece quando o servidor recebe uma desconexão

Outras dicas

Eu configuração wiresharp em ambos os lados do firewall para ver o que acontece no TCP (e nível inferior). E quando o administrador diz que o "tempo limite para connects" é algo. É que o tempo de espera para uma marcha lenta, conexão estabelecida? Qualquer outra coisa que não faz qualquer sentido, eu acho.

Além disso, você está usando a opção KeepAlive para TCP? E é que encaminhada pelo firewall ou não?

Como eu disse, provavelmente vai querer executar wireshark em ambos os lados do firewall ...

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