Ocorreu um erro em nosso software que ocorre quando recebo um tempo limite de conexão. Esses erros são muito raros (geralmente quando minha conexão é interrompida por nossa rede interna). Como posso gerar esse tipo de efeito artificialmente para testar nosso software?
Se isso importa, o aplicativo é escrito em C ++ / MFC usando as classes CAsyncSocket.
Editar:
Eu tentei usar um host inexistente e recebo o erro de soquete:
WSAEINVAL (10022) Argumento inválido
Minha próxima tentativa foi usar a sugestão de Alexander de conectar-se a uma porta diferente, por exemplo, 81 (no meu próprio servidor). Isso funcionou muito bem. Exatamente o mesmo que uma conexão descartada (espera de 60 segundos e erro). Obrigado!
networking
network-programming
connection
tcp
Mark Ingram
fonte
fonte
Respostas:
Conecte-se a um host existente, mas a uma porta bloqueada pelo firewall que simplesmente descarta pacotes TCP SYN. Por exemplo, www.google.com:81.
fonte
Conecte-se a um endereço IP não roteável, como 10.255.255.1.
fonte
urllib
, isso retornará uma exceção 'No route to host'. FYISe você estiver em uma máquina unix, poderá iniciar uma porta escutando usando o netcat:
Em seguida, modifique seu serviço para chamar o que geralmente faz para essa porta, por exemplo, http: // localhost: 8099 / some / sort / of / endpoint
Em seguida, seu serviço abrirá a conexão e gravará dados, mas nunca receberá uma resposta e, portanto, fornecerá um Tempo limite de leitura (em vez de Conexão recusada)
fonte
ssh alanse@localhost -p 8099
, parece que sim.kill -STOP <pid>
(ou apenas CTRL-Z sem colocar em segundo plano). O sistema agirá como se o servidor estivesse em execução, mas aguarde o servidor aceitar a conexão, resultando em um tempo limite de conexão (erro 110).O URL a seguir sempre dá um tempo limite e combina o melhor das respostas de @Alexander e @ Emu acima:
http://example.com:81
O uso
example.com:81
é uma melhoria na resposta de Alexander, porque o example.com é reservado pelo padrão DNS, portanto, sempre será inacessível, ao contráriogoogle.com:81
, o que pode mudar se o Google quiser. Além disso, comoexample.com
é definido como inacessível, você não estará inundando os servidores do Google.Eu diria que é uma melhoria em relação à resposta do @ emu porque é muito mais fácil de lembrar.
fonte
example.com
resolução para 93.184.216.34 e, na verdade, serve um HTML curto, explicando que é um domínio de exemplo ... a porta 81 ainda não responde.httpstat.us
como @AndyTheEntity apontado em sua resposta.example.com
não é um domínio comercial, é um dos poucos nomes de domínio que são explicitamente especificados como inutilizáveis. Ninguém pode possuirexample.com
e os roteadores DNS sabem que ele nunca é roteado para um endereço real. Portanto, não está custando tempo para ninguém, não há nada errado em usá-loexample.com
. Há infra-estrutura por trás do domínio, portanto, cada solicitação está custando o dinheiro da IANA. O uso permitido é mencionado nas RFC 2606 e RFC 6761; você não é livre para usar os domínios para qualquer finalidade que desejar, comoflodding
eles, em vez de outro servidor, como você mencionou. Sua reivindicaçãoexample.com is defined to be unreachable
incorreta, é alcançável. A porta 81 está inacessível agora, mas onde isso está definido para ser garantido no futuro?.test
domínio de nível superior, em vez deexample.com
, mas esses domínios foram claramente configurados para esse fim. Sim, pode custar à IANA um pouco de dinheiro, mas este é um serviço que eles fornecem. Nossas taxas de DNS estão pagando por isso.Muitas respostas boas, mas a solução mais limpa parece ser esse serviço
http://httpstat.us/504?sleep=60000
Você pode configurar a duração do tempo limite (até 230 segundos) e o eventual código de retorno.
fonte
Você pode usar o Python REPL para simular um tempo limite ao receber dados (ou seja, após uma conexão ter sido estabelecida com sucesso). Nada além de uma instalação padrão do Python é necessário.
Agora aguarda uma conexão de entrada. Conecte o que você deseja testar
localhost:9000
. Quando você o fizer, o Python aceitará a conexão eaccept()
a retornará. A menos que você envie dados através doclientsocket
, o soquete do chamador deve atingir o tempo limite durante o próximorecv()
.fonte
s.listen(5)
antess.accept()
?while True:
loop, e isso parece ser um bom destino de tempo limite durável a ser atingido nos testes.Todos estes não são roteáveis.
fonte
10.0.0.0
e10.255.255.255
acionamos um erro EACCES em vez de atingir o tempo limite.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, E192.168.255.255
fez tempo limite, no entanto.Eu gostaria de chamar a atenção de todos para o pathod
Com uma configuração (tirada de seus exemplos),
200:b@100:dr
você obtém uma conexão que cai aleatoriamente.fonte
Que tal uma solução de software:
Instale o servidor SSH no servidor de aplicativos. Em seguida, use o socket tunnel para criar um link entre a porta local e a porta remota no servidor de aplicativos. Você pode usar ferramentas de cliente ssh para fazer isso. Faça com que seu aplicativo cliente se conecte à sua porta local mapeada. Em seguida, você pode quebrar o túnel do soquete à vontade para simular o tempo limite da conexão.
fonte
Se você deseja usar uma conexão ativa, também pode usar http://httpbin.org/delay/# , em que # é o tempo que você deseja que o servidor espere antes de enviar uma resposta. Contanto que o tempo limite seja menor que o atraso ... deve simular o efeito. Eu usei com sucesso com o pacote de pedidos python.
Convém modificar sua solicitação se estiver enviando algo confidencial - não faço ideia do que acontece com os dados enviados a eles.
fonte
Existem serviços disponíveis que permitem criar artificialmente tempos limite de origem chamando uma API na qual você especifica quanto tempo o servidor levará para responder. O tempo limite do servidor no macgyver é um exemplo desse serviço.
Por exemplo, se você quiser testar uma solicitação que leva 15 segundos para responder, basta fazer uma solicitação de postagem à API do macgyver.
Carga JSON:
Resposta da API (após 15 segundos):
Programa de tempo limite do servidor no macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
fonte
Você pode instalar o driver Microsoft Loopback que criará uma interface separada para você. Em seguida, você pode conectar-se a algum serviço seu (seu próprio host). Em Conexões de rede, você pode desativar / ativar essa interface ...
fonte
Apesar de não estar completamente claro qual deles o OP deseja testar: há uma diferença entre tentar uma conexão com um host / porta inexistente e o tempo limite de uma conexão já estabelecida. Eu iria com Rob e esperaria até que a conexão estivesse funcionando e depois puxaria o cabo. Ou - por conveniência - tenha uma máquina virtual funcionando como servidor de teste (com rede em ponte) e desativando a interface de rede virtual assim que a conexão for estabelecida.
fonte
A técnica usada com freqüência para simular um tempo limite de conexão aleatória é usar o encaminhamento de porta local ssh.
Isso encaminhará o tráfego no localhost: 12345 para realserver.com:80. Você também pode fazer um loop na própria máquina local, se desejar:
Portanto, você pode apontar seu aplicativo para o host local e a porta personalizada, e o tráfego será roteado para o host de destino: port. Em seguida, você pode sair deste shell (também pode ser necessário pressionar Ctrl + c depois de sair) e isso eliminará o encaminhamento que faz com que o aplicativo veja uma perda de conexão.
fonte
Conecte o cabo de rede a um switch que não possui outra conexão / cabos. Isso deve funcionar imho.
fonte
Existem algumas táticas que usei no passado para simular problemas de rede;
Uma dessas idéias pode fornecer alguns meios de gerar artificialmente o cenário necessário
fonte
Dependendo do software de firewall que você instalou / disponível, você poderá bloquear a porta de saída e, dependendo de como o seu firewall estiver configurado, ele deverá apenas eliminar o pacote de solicitação de conexão. Sem solicitação de conexão, sem conexão, o tempo limite segue. Provavelmente, isso funcionaria melhor se fosse implementado no nível do roteador (eles tendem a soltar pacotes em vez de enviar redefinições, ou qualquer que seja o equivalente para a situação), mas certamente haverá um pacote de software que também funcionaria.
fonte
O mais fácil seria interromper sua conexão usando o CurrPorts .
No entanto, para testar seu código de manipulação de exceções, talvez você deva abstrair seu código de conexão de rede e escrever um esboço, simulação ou decorador que lança exceções sob demanda. Você poderá testar a lógica de tratamento de erros do aplicativo sem precisar usar a rede.
fonte
recv()
falhe imediatamente), mas não consegui encontrar uma maneira de simular um tempo limite (ou seja, não há mais dados transferidos, mas a conexão permanece aberta).Eu tive problemas nas mesmas linhas que você. Para testar o comportamento do software, acabei de desconectar o cabo de rede no momento apropriado. Eu tive que definir um ponto de interrupção antes de querer desconectar o cabo.
Se eu estivesse fazendo isso de novo, colocaria um comutador (um botão momentâneo normalmente fechado) em um cabo de rede.
Se a desconexão física causar um comportamento diferente, você poderá conectar seu computador a um hub barato e colocar o comutador mencionado acima entre o hub e a rede principal.
- EDIT - Em muitos casos, você precisará da conexão de rede funcionando até chegar a um determinado ponto do seu programa; então, você poderá desconectar usando uma das muitas sugestões oferecidas.
fonte
Para mim, a maneira mais fácil foi adicionar rota estática no roteador do escritório com base na rede de destino. Apenas direcione o tráfego para algum host que não responda (por exemplo, o seu computador) e você receberá o tempo limite da solicitação.
A melhor coisa para mim foi que a rota estática pode ser gerenciada através da interface da web e ativada / desativada facilmente.
fonte
Você pode tentar se conectar a um dos sites conhecidos em uma porta que pode não estar disponível externamente - 200 por exemplo. A maioria dos firewalls funciona no modo DROP e simula um tempo limite para você.
fonte