Domanda

Ho avuto un bug nel software che si verifica quando ricevo un timeout di connessione.Questi errori sono molto rari (di solito quando la mia connessione cade dalla nostra rete interna).Come posso generare questo tipo di effetto artificialmente, così posso testare il nostro software?

Se è importante l'applicazione è scritta in C++/MFC utilizza CAsyncSocket classi.

Edit:

Ho provato con un inesistente host, e ottengo l'errore socket:

WSAEINVAL (10022) argomento non Valido

Il mio prossimo tentativo è stato quello di utilizzare Alexander's suggerimento di collegamento a una porta diversa, ad es.81 (nel mio server).Che ha lavorato molto.Esattamente come una caduta di connessione (60 secondi di attesa, quindi, di un errore).Grazie!

È stato utile?

Soluzione

Connettersi a un host esistente, ma di una porta bloccata dal firewall che semplicemente gocce di pacchetti TCP SYN.Per esempio, www.google.com:81.

Altri suggerimenti

Connettersi a un indirizzo IP non instradabile, come 10.255.255.1.

Se siete su una macchina unix, è possibile avviare una porta di ascolto utilizzando netcat:

nc -l 8099

Quindi, modificare il servizio a chiamata di qualunque cosa si fa di solito verso la porta, ad es. http://localhost:8099/some/sort/of/endpoint

Quindi, il servizio verrà aperta la connessione e scrivere i dati, ma non potrà mai ottenere una risposta, e così vi darà una Lettura di Tempo (anziché Connessione Rifiutata)

Il seguente URL dà sempre un timeout, e combina il meglio dei @Alexander e @Emu risposte sopra:

http://example.com:81

Utilizzando example.com:81 è un miglioramento di Alexander risposta perché example.com è riservato per il DNS standard, in modo da essere sempre raggiungibile, a differenza di google.com:81, che può cambiare se Google si sente come esso.Inoltre, poiché example.com è definito per essere irraggiungibile, non sarà inondazioni server di Google.

Direi che si tratta di un miglioramento rispetto @emu risposta, perché è molto più facile da ricordare.

È possibile utilizzare il Python REPL per simulare un timeout durante la ricezione dei dati (es.dopo che la connessione è stata stabilita con successo).Nulla, ma una installazione standard di Python è necessario.

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()

Ora si attende una connessione in ingresso.Collegare qualsiasi cosa che si desidera testare per localhost:9000.Quando si esegue, Python accettare la connessione e accept() tornerà.A meno che non si invia i dati attraverso il clientsocket, il chiamante socket dovrebbe il tempo, durante il prossimo 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

Tutti questi non sono accessibili.

A questo punto vorrei l'attenzione di tutti per pathod

Con una config (preso da loro esempi) di 200:b@100:dr avrai una connessione che elimina in modo casuale.

Come su una soluzione software:

Installare un server SSH sul server dell'applicazione.Quindi, utilizzare la presa tunnel per creare un collegamento tra la porta locale e la porta remota sul server di applicazioni.È possibile utilizzare il client ssh strumenti per farlo.Avere la vostra applicazione client di connettersi al vostro locale mappato la porta, invece.Quindi, si può rompere la presa tunnel per simulare il timeout di connessione.

Se si desidera utilizzare una connessione attiva, è possibile utilizzare anche http://httpbin.org/delay/#, dove # è il tempo che si desidera che il loro server di attendere prima di inviare una risposta.Fintanto che il vostro tempo è più breve di ritardo ...dovrebbe simulare l'effetto.Ho usato con successo con il python richieste di pacchetto.

Se si desidera modificare la vostra richiesta, se si sta inviando qualcosa di sensibile - nessuna idea di cosa succede ai dati inviati a loro.

Sono disponibili servizi che consentono di creare artificialmente origine timeout chiamando un'API in cui è possibile specificare per quanto tempo il server avrà a rispondere.Timeout del Server su macgyver è un esempio di un tale servizio.

Per esempio, se si voleva testare una richiesta che dura 15 secondi di tempo per rispondere è sufficiente fare una richiesta post per il macgyver API.

Payload JSON:

{
    "timeout_length": 15000
}

Risposta API (Dopo 15 secondi):

{
    "response": "ok"
}

Timeout del Server di programma su macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

È possibile installare Microsoft Loopback driver che crea un'interfaccia separata per voi.Quindi è possibile collegare su di esso per alcuni servizi di tuo (host).Poi in Connessioni di Rete, è possibile disattivare/attivare tale interfaccia...

Nonostante il risultato non è del tutto chiaro quale sia l'OP vuole testare:c'è una differenza tra il tentativo di una connessione ad un inesistente host/porta e un timeout di una connessione già stabilita.Vorrei andare con Rob e attendere che la connessione funziona e poi tirare il cavo.O - per comodità - dispone di una macchina virtuale che funziona come il server di prova (con bridged networking) e basta disattivare l'interfaccia di rete virtuale una volta che la connessione è stabilita.

La tecnica che uso spesso per simulare un casuale timeout di connessione è quello di utilizzare ssh locale di port forwarding.

ssh -L 12345:realserver.com:80 localhost

Questo permetterà di inoltrare il traffico su localhost:12345 per realserver.com:80 Si può loop intorno nella vostra macchina locale, come pure, se volete:

ssh -L 12345:localhost:8080 localhost

Così si può puntare l'applicazione a localhost e porta personalizzata, e il traffico verranno instradati per l'host di destinazione:port.Quindi si può uscire fuori da questo guscio (si può anche bisogno di ctrl+c shell dopo l'uscita) e ucciderà la inoltro che provoca l'app per vedere una perdita di connessione.

Collegare il cavo di rete in un interruttore che non ha altro di connessione/cavi.Che dovrebbe funzionare imho.

Ci sono un paio di tattiche che ho usato in passato per simulare problemi di rete;

  1. Estrarre il cavo di rete
  2. Spegnere l'interruttore (idealmente con l'interruttore che il computer è collegato in ancora essere alimentato in modo che la macchina mantiene il suo "connessione di rete") tra la macchina e il "target" della macchina
  3. Eseguire il software firewall sul computer di destinazione, che in silenzio gocce dati ricevuti

Una di queste idee potrebbe dare qualche mezzo di artifically generare lo scenario è necessario

A seconda di che cosa firewall software installato/disponibili, si dovrebbe essere in grado di bloccare la porta in uscita e, a seconda di come il vostro firewall è il programma di installazione si deve solo eliminare la richiesta di connessione a pacchetto.Nessuna richiesta di connessione, nessuna connessione, timeout segue.Questo probabilmente potrebbe funzionare meglio se è stato implementato a livello dei router (tendono a scartare i pacchetti invece di inviare il reset, o qualunque sia l'equivalente per la situazione), ma c'è sicuramente di essere un pacchetto software che piacerebbe fare il trucco troppo.

La cosa più semplice sarebbe caduta la connessione utilizzando CurrPorts.

Tuttavia, per unità di testare il tuo codice di gestione delle eccezioni, forse si dovrebbe prendere in considerazione astrarre la connessione di rete codice e scrivere una stub, deridere o decoratore che genera eccezioni su richiesta.Si sarà quindi in grado di testare l'applicazione per la gestione degli errori di logica, senza aver bisogno di utilizzare la rete.

Io ho avuto problemi lungo le stesse linee si fanno.Per testare il comportamento del software, ho appena staccato il cavo di rete al momento opportuno.Ho dovuto impostare un punto di rottura, la destra prima ho voluto staccare il cavo.

Se dovessi farlo di nuovo, avevo messo un interruttore normalmente chiuso pulsante momentaneo) in un cavo di rete.

Se il fisico scollegare le cause di un comportamento diverso, è possibile collegare il computer a un buon mozzo e mettere l'interruttore che ho citato sopra tra il mozzo e la rete principale.

-- EDIT -- In molti casi è necessario che la connessione di rete a lavorare fino a quando si arriva a un certo punto del programma, QUINDI ti consigliamo di scollegare utilizzando uno dei tanti suggerimenti offerti.

Per me il modo più semplice è aggiungere route statica office router basato sulla rete di destinazione.Basta indirizzare il traffico verso alcuni non risponde host (ad es.il computer) e si otterrà la richiesta di timeout.

La cosa migliore per me era che route statica può essere gestito tramite interfaccia web e attivato/disattivato facilmente.

Un sacco di risposte, ma la soluzione più pulita sembra essere questo servizio

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

È possibile configurare il timeout durata (fino a 230 secondi) e l'eventuale codice di ritorno.

Puoi provare a connettersi a uno di ben noti siti Web su una porta che potrebbe non essere disponibile al di fuori - 200, per esempio.La maggior parte dei firewall lavoro in CALO modalità e simula un timeout per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top