Pergunta

Eu tive um bug no nosso software que ocorre quando eu receber um tempo limite de conexão. Esses erros são muito raros (geralmente quando minha conexão é derrubada pela nossa rede interna). Como posso gerar esse tipo de efeito artificialmente para que eu possa testar o nosso software?

Se é importante o aplicativo é escrito em C ++ / MFC usando classes CAsyncSocket.

Editar:

Eu tentei usar uma série inexistente, e eu recebo o erro socket:

WSAEINVAL (10022) Invalid argument

A minha próxima tentativa foi a de usar a sugestão 's Alexander de se conectar a uma porta diferente, por exemplo, 81 (no meu próprio embora servidor). Isso funcionou muito bem. Exatamente o mesmo que uma conexão caiu (60 segundos de espera, depois de erro). Obrigado!

Foi útil?

Solução

Conectar a um host existente, mas a uma porta que está bloqueada pelo firewall que simplesmente descarta pacotes TCP SYN. Por exemplo, www.google.com:81.

Outras dicas

conectar a um endereço IP não-roteáveis, como 10.255.255.1.

Se você estiver em uma máquina UNIX, você pode começar uma escuta porta usando netcat:

nc -l 8099

Em seguida, modificar-lhe o serviço de chamada seja o que geralmente faz com que a porta por exemplo http: // localhost: 8099 / some / tipo / de / endpoint

Em seguida, o serviço irá abrir os dados de conexão e escrever, mas nunca obter uma resposta, e assim vai lhe dar uma Leia Time Out (em vez de Conexão recusada)

O seguinte URL sempre dá um tempo limite, e combina o melhor da @Alexander e @ respostas do Emu acima:

http://example.com:81

Usando example.com:81 é uma melhoria em resposta de Alexander porque example.com é reservado pelo padrão DNS, por isso será sempre inatingível, ao contrário google.com:81, o que pode mudar se o Google se sente como ele. Também, porque example.com é definida para ser inacessível, você não vai ser inundando os servidores do Google.

Eu diria que é uma melhoria em relação resposta de @ emu porque é muito mais fácil de lembrar.

Você pode usar o Python REPL para simular um tempo limite durante a recepção de dados (ou seja, depois que uma conexão foi estabelecida com sucesso). Nada, mas é necessária uma instalação padrão do Python.

Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
>>> s.bind(('localhost', 9000))
>>> s.listen(0)
>>> (clientsocket, address) = s.accept()

Agora, ele espera por uma conexão de entrada. Ligar o que você quiser teste para localhost:9000. Quando o fizer, Python aceitará a conexão e accept() vai devolvê-lo. A menos que você enviar quaisquer dados através do clientsocket, tomada do chamador devem expirar durante a próxima recv().

  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

Todos estes são não roteáveis.

Gostaria de atenção ponto de todos para pathod

Com uma config (tiradas de seus exemplos) de 200:b@100:dr você vai ter uma conexão que cai aleatoriamente.

Como sobre uma solução de software:

Instale servidor SSH no servidor de aplicativos. Em seguida, use túnel soquete para criar uma ligação entre o porto local e a porta remota no servidor de aplicativos. Você pode usar ferramentas de cliente SSH para fazê-lo. Ter o seu aplicativo cliente se conectar à sua porta local mapeada em vez. Então, você pode quebrar o túnel tomada à vontade para simular o tempo limite de conexão.

Se você quiser usar uma conexão ativa você também pode usar http://httpbin.org/delay/# , onde # é o tempo que você quer seu servidor para aguardar antes de enviar uma resposta. Enquanto o seu tempo limite é mais curto do que o atraso ... deve simular o efeito. Eu usei-o com sucesso com o pacote de pedidos de python.

Você pode querer modificar o seu pedido, se você está enviando nada sensível -. Idéia do que acontece com os dados enviados a eles

Existem serviços disponíveis que lhe permitem criar artificialmente o tempo limite de origem chamando uma API onde você especificar quanto tempo o servidor terá de responder. Servidor Timeout em MacGyver é um exemplo de tal serviço a.

Por exemplo, se você quiser testar um pedido que leva 15 segundos para responder, você poderia simplesmente fazer uma solicitação POST para o API MacGyver.

JSON Payload:

{
    "timeout_length": 15000
}

Response API (Após 15 segundos):

{
    "response": "ok"
}

Servidor Timeout programa no macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Você pode instalar o Microsoft Loopback motorista que irá criar uma interface separada para você. Então você pode se conectar com ele para algum serviço de sua (seu próprio host). Em seguida, em Conexões de Rede, você pode ativar / desativar tal interface de ...

Apesar de não é completamente claro qual o OP quer teste: há uma diferença entre tentar uma conexão a um inexistente host / porto e um tempo limite de uma conexão já estabelecida. Eu iria com Rob e esperar até que a conexão está funcionando e, em seguida, puxe o cabo. Ou - por conveniência - têm uma máquina virtual a trabalhar como o servidor de teste (com a rede em ponte) e apenas desactivar a interface de rede virtual uma vez que a conexão é estabelecida

.

A técnica que eu uso com freqüência para simular um tempo limite de conexão aleatória é usar ssh encaminhamento de porta local.

ssh -L 12345:realserver.com:80 localhost

Isto irá encaminhar o tráfego em localhost: 12345 para realserver.com:80 Você pode fazer um loop esta em torno de sua própria máquina local, bem como, se você quiser:

ssh -L 12345:localhost:8080 localhost

Assim, você pode apontar o seu aplicativo em seu localhost e personalizado porto, eo tráfego vai ser encaminhado para o host de destino: porta. Então você pode sair deste shell (você também pode precisar de ctrl + c do shell após sair) e vai matar o transitária que faz com que seu aplicativo para ver uma perda de conexão.

Conecte o cabo de rede em um switch que não tem outra conexão / cabos. Isso deve funcionar imho.

Há um par de táticas que eu usei no passado para simular problemas de rede;

  1. Retire o cabo de rede
  2. Desligue o interruptor (de preferência com o interruptor que o computador está conectado a ainda a ser alimentado para que a máquina mantém-lo de "conexão de rede") entre sua máquina ea máquina de "destino"
  3. Executar software firewall na máquina de destino que os dados silenciosamente gotas receberam

Uma dessas idéias pode dar-lhe alguns meios de gerar artificialmente o cenário que você precisa

Dependendo do software de firewall que você instalou / disponíveis, você deve ser capaz de bloquear a porta de saída e dependendo de como o firewall está configurado ele deve apenas deixar cair o pacote de solicitação de conexão. No pedido de ligação, nenhuma conexão, ensues tempo limite. Isso provavelmente funcionaria melhor se ele foi implementado em um nível router (eles tendem a descartar pacotes em vez de enviar resets, ou qualquer que seja o equivalente é para a situação), mas não é obrigado a ser um pacote de software que iria fazer o truque também.

A coisa mais fácil seria deixar cair a sua conexão usando CurrPorts .

No entanto, a fim de unidade de teste o seu código de manipulação de exceção, talvez você deve considerar abstraindo o seu código de conexão de rede, e escrever um esboço, simulada ou decorador que gera exceções na demanda. Então você vai ser capaz de testar a lógica da aplicação de tratamento de erros, sem ter que usar a rede.

Eu tive problemas ao longo das mesmas linhas que você faz. A fim de testar o comportamento do software, eu só desligou o cabo de rede no momento apropriado. Eu tive que definir um certo ponto-break antes de eu queria desconectar o cabo.

Se eu estivesse fazendo isso de novo, eu ia colocar um interruptor (a normalmente fechado pressão momentânea um botão) em um cabo de rede.

Se a desconexão física provoca um comportamento diferente, você pode conectar seu computador a um hub barato e colocar o interruptor que eu mencionei acima entre o seu hub e da rede principal.

- EDIT - Em muitos casos, você vai precisar da conexão de rede trabalhando até chegar a um determinado ponto em seu programa, então você vai querer desligar usando uma das muitas sugestões oferecidas.

Para mim maneira mais fácil foi a adição de rota estática no roteador de escritório com base na rede de destino. rotear o tráfego apenas para alguns anfitrião não responder (por exemplo, o computador) e você obterá pedido de tempo limite.

A melhor coisa para mim foi que rota estática pode ser gerenciada através da interface web e ativado / desativado facilmente.

A abundância de boas respostas, mas a solução mais limpa parece ser este serviço

http://httpstat.us/504?sleep=60000

Você pode configurar o tempo de espera (até 230 segundos) e eventual código de retorno.

Você pode tentar se conectar a um dos sites bem conhecidos em uma porta que pode não estar disponível a partir do exterior - 200, por exemplo. A maioria dos firewalls trabalhar em modo GOTA e vai simular um tempo limite para você.

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