Yazılımımızda, bir bağlantı zaman aşımı aldığımda oluşan bir hata oluştu. Bu hatalar çok nadir görülür (genellikle bağlantım iç ağımız tarafından kesildiğinde). Bu tür bir etkiyi yapay olarak nasıl üretebilirim, böylece yazılımımızı test edebilirim?
Önemli ise, uygulama CAsyncSocket sınıfları kullanılarak C++/MFC dilinde yazılmıştır.
Düzenle:
Var olmayan bir Ana Bilgisayar kullanmayı denedim ve yuva hatasını alıyorum:
WSAEINVAL (10022) Geçersiz değişken
Bir sonraki denemem Alexander 'in farklı bir limana bağlanma önerisini kullanmaktı. 81 (kendi sunucumda olsa). Harika çalıştı. Tamamen kesik bağlantıyla aynı (60 saniye bekledikten sonra hata). Teşekkür ederim!
Mevcut bir Host cihazına, ancak TCP SYN paketlerini düşüren güvenlik duvarı tarafından engellenen bir bağlantı noktasına bağlayın. Örneğin, www.google.com:81.
10.255.255.1 gibi yönlendirilemez bir IP adresine bağlanın.
Bir unix makinesindeyseniz, netcat kullanarak dinleyen bir bağlantı noktası başlatabilirsiniz:
nc -l 8099
Ardından, hizmetinizi genellikle o bağlantı noktasına ne yaparsa yapsın; http: // localhost: 8099/bazı/sort///endpoint
Ardından, servisiniz bağlantıyı açacak ve veri yazacak, ancak hiçbir zaman bir yanıt alamayacak ve böylece size bir Okuma Zaman Aşımı verecek (Bağlantı Reddedilmeden)
Aşağıdaki URL her zaman zaman aşımına uğrar ve yukarıdaki @Alexander ve @ Emu'nun en iyi yanıtlarını birleştirir:
example.com:81
kullanmak, Alexander'in cevabındaki bir gelişmedir, çünkü example.com, DNS standardına göre ayrılmıştır, bu nedenle, Google'ın istediği gibi değişebilecek olan google.com:81
'dan farklı olarak, her zaman erişilmez olacaktır. Ayrıca, example.com
erişilemez olarak tanımlandığından, Google sunucularını su basmayacaksınız.
@ Emu'nun cevabında bir gelişme olduğunu söyleyebilirim çünkü hatırlaması çok daha kolay.
Veri alırken zaman aşımını benzetmek için Python REPL 'ı kullanabilirsiniz (örneğin, bağlantı başarıyla kurulduktan sonra). Standart bir Python kurulumundan başka bir şey gerekmiyor.
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()
Şimdi gelen bir bağlantıyı bekler. Test etmek istediğiniz her şeyi localhost:9000
adresine bağlayın. Bunu yaptığınızda, Python bağlantıyı kabul edecek ve accept()
geri döndürecektir. clientsocket
üzerinden herhangi bir veri göndermezseniz, arayanın soketi bir sonraki recv()
sırasında zaman aşımına uğramalıdır.
10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255
bütün bunlar yönlendirilemez.
Herkesin dikkatini patod ye dikkat çekmek isterim
200:[email protected]:dr
bir yapılandırmasıyla (örneklerinden alınmış) rasgele açılan bir bağlantı elde edersiniz.
Bir yazılım çözümüne ne dersiniz:
Uygulama sunucusuna SSH sunucusunu yükleyin. Ardından, yerel portunuzla uygulama sunucusundaki uzak port arasında bir bağlantı oluşturmak için soket tüneli kullanın. Bunu yapmak için ssh istemci araçlarını kullanabilirsiniz. İstemci uygulamanızın bunun yerine eşlenen yerel bağlantı noktasına bağlanmasını sağlayın. Ardından, bağlantı zaman aşımını simüle etmek için soket tüneli istediğiniz zaman kırabilirsiniz.
Etkin bir bağlantı kullanmak istiyorsanız, http://httpbin.org/delay/# komutunu da kullanabilirsiniz, burada #, sunucularının yanıt göndermeden önce beklemelerini istediğiniz zamandır. Zaman aşımınız gecikmeden kısa olduğu sürece ... etkiyi simüle etmelidir. Python istekleri paketiyle başarıyla kullandım.
Hassas bir şey gönderiyorsanız isteğinizi değiştirmek isteyebilirsiniz - onlara gönderilen verilere ne olduğu hakkında hiçbir fikriniz yok.
Sunucunun ne kadar sürede yanıt vereceğini belirleyeceğiniz bir API'yi arayarak Yapay olarak Origin zaman aşımları oluşturmanıza olanak sağlayan hizmetler vardır. Macgyver'da Sunucu Zaman Aşımı, böyle bir hizmete bir örnektir.
Örneğin, 15 saniye süren bir isteği test etmek istiyorsanız, yalnızca macgyver API'sine bir posta isteği gönderirsiniz.
JSON Yükü:
{
"timeout_length": 15000
}
API Yanıtı (15 saniye sonra):
{
"response": "ok"
}
Macgyver'da Sunucu Zaman Aşımı Programı
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
Sizin için ayrı bir arayüz oluşturacak olan Microsoft Loopback sürücüsünü yükleyebilirsiniz. Daha sonra bazı servislerinize (kendi Host cihazınıza) bağlanabilirsiniz. Ardından Ağ Bağlantıları'nda bu arayüzü devre dışı bırakabilir/etkinleştirebilirsiniz ...
Rasgele bir bağlantı zaman aşımını simüle etmek için sık sık kullandığım teknik, ssh yerel port iletmeyi kullanmaktır.
ssh -L 12345:realserver.com:80 localhost
Bu, localhost'taki trafiği iletir: 12345 - realserver.com:80 İsterseniz, bunu kendi yerel makinenizde de dolaşabilirsiniz:
ssh -L 12345:localhost:8080 localhost
Böylece uygulamanızı yerel ana makinenize ve özel bağlantı noktanıza yönlendirebilirsiniz; trafik hedef Ana bilgisayara: bağlantı noktasına yönlendirilir. Sonra bu Kabuktan çıkabilirsiniz (çıktıktan sonra Kabuk ctrl + c'ye gerek duyabilirsiniz) ve uygulamanızın bir bağlantı kaybını görmesine neden olan iletimi keser.
OP'nin hangisini test etmek istediği kesin olarak bilinmemekle birlikte, var olmayan bir Ana Bilgisayar/bağlantı noktasıyla bağlantı kurmaya çalışmak ve önceden kurulmuş bir bağlantı zaman aşımı arasında bir fark var. Rob ile gider ve bağlantı çalışana kadar beklerdim ve sonra kabloyu çekerdim. Veya - kolaylık sağlamak için - test sunucusu olarak çalışan bir sanal makineye sahip olun (köprülü ağ bağlantısı ile) ve bağlantı kurulduktan sonra yalnızca sanal ağ arayüzünü devre dışı bırakın.
Seninle aynı çizgide sorunlar yaşadım. Yazılım davranışını test etmek için sadece uygun zamanda ağ kablosunu çıkardım. Kabloyu çıkarmak istemeden hemen önce bir kırılma noktası ayarlamam gerekiyordu.
Tekrar yapıyor olsaydım, bir ağ kablosuna bir anahtar (normalde kapalı anlık bir düğme bir tane) koyardım.
Fiziksel bağlantı kesme işlemi farklı bir davranışa neden olursa, bilgisayarınızı ucuz bir hub'a bağlayabilir ve yukarıda bahsettiğim anahtarı hub'ınız ve ana ağ arasına koyabilirsiniz.
- EDIT -- Çoğu durumda, programınızdaki belirli bir noktaya ulaşana kadar çalışan ağ bağlantısına ihtiyacınız olacak, ardından, sunulan önerilerden birini kullanarak bağlantıyı kesmek isteyeceksiniz.
En kolay şey CurrPorts kullanarak bağlantınızı kesmek olacaktır.
Bununla birlikte, istisna işleme kodunuzu birim test etmek için, belki ağ bağlantı kodunuzu özetlemeyi düşünmelisiniz ve talep üzerine istisnalar atan bir saplama, alay veya dekoratör yazmalısınız. Ardından, uygulama hata işleme mantığını, ağı gerçekten kullanmak zorunda kalmadan test edebileceksiniz.
Bol miktarda iyi cevap var ama en temiz çözüm gibi görünüyor bu hizmet
http://httpstat.us/504?sleep=60000
Zaman aşımı süresini (230 saniyeye kadar) ve olası dönüş kodunu yapılandırabilirsiniz.
Benim için en kolay yol, hedef ağa bağlı olarak ofis yönlendiricisine statik yol eklemekti. Trafiği yanıt vermeyen bazı Ana Bilgisayarlara (örneğin bilgisayarınız) yönlendirmeniz yeterlidir; istek zaman aşımına uğrar.
Benim için en iyi şey statik yolun web arayüzü üzerinden yönetilip kolayca etkinleştirilip devre dışı bırakılabilmesiydi.
Ağ kablonuzu, başka bağlantısı/kablosu olmayan bir anahtara takın. Bu işe yaramalı.
Geçmişte ağ oluşturma sorunlarını simüle etmek için kullandığım birkaç taktik var;
Bu fikirlerden biri size ihtiyaç duyduğunuz senaryoyu yapay olarak yaratmanın bazı yollarını verebilir.
Hangi güvenlik duvarı yazılımını kurduğunuz/kullandığınıza bağlı olarak, giden bağlantı noktasını engelleyebilmeniz ve güvenlik duvarınızın nasıl kurulduğuna bağlı olarak, bağlantı isteği paketini bırakması gerekir. Bağlantı isteği yok, bağlantı yok, zaman aşımına uğradı. Yönlendirici düzeyinde gerçekleştirildiyse, bu muhtemelen daha iyi sonuç verir (sıfırlama göndermek yerine paketleri düşürme eğilimindedirler veya durumun karşılığı ne olursa olsun) ancak hile yapan bir yazılım paketi de vardır.