Yapay olarak bir bağlantı zaman aşımı hatası oluştur


291

Yazılımımızda bir bağlantı zaman aşımı aldığımda oluşan bir hata yaşadım. Bu hatalar çok nadirdir (genellikle bağlantım dahili ağımız tarafından kesildiğinde). Yazılımımızı test edebilmem için bu tür bir efekti yapay olarak nasıl üretebilirim?

Önemliyse uygulama CAsyncSocket sınıflarını kullanarak C ++ / MFC'de yazılır.

Düzenle:

Varolmayan bir ana bilgisayar kullanmayı denedim ve soket hatası alıyorum:

WSAEINVAL (10022) Geçersiz argüman

Bir sonraki girişimim Alexander'ın farklı bir bağlantı noktasına bağlanma önerisini kullanmaktı , örneğin 81 (kendi sunucumda olsa da). Harika çalıştı. Kesilen bağlantıyla tam olarak aynı (60 saniye bekleyin, sonra hata). Teşekkür ederim!


Merhaba Mark, sizin için çalışan bir çözüm denedim ama aldığım # 503 (Hizmet Kullanılamıyor.). Bunlardan biri olmamalı, # 504 (Ağ Geçidi Zaman Aşımı), # 599 (Ağ bağlantısı zaman aşımı hatası), # 598 (Ağ okuma zaman aşımı hatası).
Kod

Yanıtlar:


297

Varolan bir ana bilgisayara, ancak güvenlik duvarı tarafından TCP SYN paketlerini bırakan bir bağlantı noktasına bağlanın. Örneğin, www.google.com:81.


6
Bu cevap basit ve aşağıdaki @ emu'nun cevabı gibi çalışıyor. Bu cevabın google.com:81 kullanılmasını önermek istemediğini anlıyorum, ancak buradaki nokta, engellenen farklı bir bağlantı noktası kullanmaktır. Böylece her zaman <your-own-ip>: <blocked-port> kullanabilirsiniz.
James Selvakumar

6
Kendi sunucunuz olmadığı sürece, testiniz için diğer sunuculara vurmak kabadır. 10.255.255.1 gibi yönlendirilemeyen bir IP adresine basarak aşağıda belirtilen emu gibi uygar bir çözüm kullanın veya test amacıyla kendi sanal sunucunuzu kurun.
zeeshan

2
Google'ın bu bağlantı noktasını engellemiş olabileceğini düşünüyorum. Bunu Chrome ile test ettiğimde, yalnızca "Sunucu kullanılamıyor". Aşağıdaki @ emu'nun hünerini kullandığımda bağlantı beklendiği gibi askıda kalıyor. Bir şey mi kaçırıyorum?
entpnerd

OP kendi sunucusundaki 81 numaralı bağlantı noktasına bağlandığını ve zaman aşımına uğradığını söyledi. Bu benim için de işe yaradı. emu'nun çözümü bana Android'de bir UnknownHostException verdi.
Barry Fruitman

2
Bu, bağlantıyı reddetti, zaman aşımı değil.
Mehdi

425

10.255.255.1 gibi yönlendirilemeyen bir IP adresine bağlanın.


12
Idem, ve sanırım bu daha iyi bir cevap çünkü google.com:81 bir gün erişilebilir olabilir.
Gui13

139
... ve ünite testlerinizden başkalarının sunucularına rastgele paketler göndermek kabalıktır.
Glenn Maynard

15
Bu her zaman işe yaramaz. Örneğin, Python'larda bu urllib, 'Ana bilgisayara yol yok' özel durumu döndürülür. FYI
Mike Shultz

8
10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255 bunların tümü yönlendirilemez.
rajesh_kw

4
@FHI tarafından belirtilen "Barındırma yolu yok" hatası genellikle iki durumda görünür: (a) yerel LAN'ınızda erişilemeyen bir ana bilgisayara bağlanmaya çalıştığınızda (yani, ARP sorgularına cevap vermez, bu nedenle temelde bir " ARP zaman aşımı "). Ve (b) bir yönlendirici ilgili ICMP hatasını verdiğinde. İlk durum, test ettiğiniz özel IP ile aynı alt ağdaysanız olur. Bir yönlendirici paketinizi hedefine nasıl yönlendireceğini bilmiyorsa, ancak bazı durumlarda ICMP hatası göndermeden paketi düşürürler.
Ale

47

Bir unix makinesindeyseniz, netcat kullanarak bir bağlantı noktası dinleme başlatabilirsiniz:

nc -l 8099

Ardından, hizmetinizi, bu bağlantı noktasına genellikle ne yaparsa onu arayacak şekilde değiştirin, örneğin http: // localhost: 8099 / some / sort / of / endpoint

Ardından, hizmetiniz bağlantıyı açacak ve veri yazacak, ancak hiçbir zaman yanıt almayacak ve bu nedenle size bir Okuma Zaman Aşımı (Bağlantı Reddedildi yerine) verecektir.


1
Uygulamanızın hangi verileri ittiğini görebildiğiniz için kullanışlıdır. Başvurunuzun bir yanıt isteyip istemediğini kontrol edebilirsiniz.
Paul

Bu, belirtildiği gibi bir tür uç noktaya gitmek için doğrudur, ancak başka bir şekilde bağlanmaya çalışırsam hızlı bir şekilde reddedilen bir bağlantı verir, bu da şu anda alay etmeye çalıştığım davranış değildir.
AlanSE

@AlanSE - başka ne demek istiyorsun? Bağlantı noktası numarasından sonra istediğiniz her şeye sahip olabilirsiniz; Netcat, herhangi bir URL'yi işlemek için hiçbir şeye sahip olmadığı için umursamaz
Tom Chamberlain

@TomChamberlain Ah bekle, ne yaptığımı biliyor olabilirim. Bir ssh bağlantı zaman aşımı benzetimi yapmaya çalışıyorum. Bu yüzden localhost, port 8099'u veriyorum, ama daha önce bir kullanıcı adı vermedim, bu yüzden sadece bir şey koyarsam ssh alanse@localhost -p 8099, öyle görünüyor.
AlanSE

7
Bir bağlantı zaman aşımını soket düzeyinde test etmek için, nc işlemini bir kill -STOP <pid>(veya arka plana koymadan CTRL-Z ile) ile dondurun . Sistem, sunucu çalışıyormuş gibi davranacaktır ancak sunucunun bağlantıyı kabul etmesini bekleyerek bağlantı zaman aşımına neden olacaktır (errno 110).
hayırsever

27

Aşağıdaki URL her zaman bir zaman aşımı verir ve yukarıdaki @Alexander ve @ Emu'nun en iyi yanıtlarını birleştirir:

http://example.com:81

Kullanmak example.com:81Alexander'ın cevabında bir gelişmedir çünkü example.com DNS standardı tarafından ayrılmıştır, bu nedenle google.com:81Google'ın kendini beğenmesi durumunda değişebilecek olan her zaman erişilemez olacaktır . Ayrıca, example.comerişilemez olarak tanımlandığı için Google'ın sunucularını su altında bırakmayacaksınız.

@ Emu'nun cevabı üzerinde bir gelişme olduğunu söyleyebilirim, çünkü hatırlanması çok daha kolay.


2
şu anda example.com93.184.216.34 çözme görmek ve aslında bunun örnek bir etki alanı açıklayan kısa bir HTML hizmet vermektedir ... 81 numaralı bağlantı noktası hala yanıt vermiyor.
Beni Cherniavsky-Paskin

Soru, example.com'un bu şekilde kullanılması gerekip gerekmediğidir. Sadece test paketleri ile sular altında kalmayı resmen özgür kılarsa, bu alan adı diğer ticari alanlardan daha iyidir. İzinsiz bu tür amaçlarla alan adlarının kullanılması etik değildir, en azından yasa dışı olmasa da, bu paketleri işlemek için paraya mal olur. httpstat.usCevabında işaret ettiği gibi @AndyTheEntity kullanmayı düşünün .
Manuel

@Manuel Bu noktayı kaçırıyorsunuz ... example.comticari bir alan adı değil, açıkça kullanılamaz olarak belirtilen birkaç alan adından biri. Kimse sahip olamaz example.comve DNS yönlendiricileri bunun asla gerçek bir adrese yönlendirilmediğini bilmez. Yani kimsenin sunucu zamanına mal olmaz, onu kullanmakta yanlış bir şey yok
speedplane

@speedplane IANA, alan adı yönetmeliğine sahiptir ve amacını açıklayan bir web sayfası sağlayan bir web sunucusu bulundurur example.com. Alanın arkasında altyapı var, bu yüzden her talep IANA parasına mal oluyor. İzin verilen kullanıma RFC 2606 ve RFC 6761'de atıfta bulunulur, etki alanlarını, istediğiniz gibi, floddingbaşka bir sunucu yerine , sizin gibi herhangi bir amaç için kullanamazsınız . example.com is defined to be unreachableYanlış iddianıza ulaşılabilir. 81 numaralı bağlantı noktasına şu anda ulaşılamıyor, ancak gelecekte garanti edilecek olan nerede tanımlanıyor?
Manuel

İşaret ettiğiniz RFC özellikle DNS testine izin verir. Bunun .testyerine, üst düzey bir alan adı kullanmanızı önerirler example.com, ancak bu alanlar bu amaç için açıkça oluşturulmuştur. Evet, IANA'ya biraz paraya mal olabilir, ancak bu sağladıkları bir hizmettir. DNS ücretlerimiz bunun için ödeme yapıyor.
speedplane

23

Çok iyi cevaplar ama en temiz çözüm bu hizmet gibi görünüyor

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

Zaman aşımı süresini (230 saniyeye kadar) ve nihai dönüş kodunu yapılandırabilirsiniz.


16

Veri alırken zaman aşımını simüle etmek için Python REPL'i kullanabilirsiniz (örn. Bağlantı başarıyla kurulduktan sonra). Standart bir Python kurulumundan başka bir şey gerekmez.

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 bağlantıyı bekliyor. Test etmek istediğiniz her şeyi bağlayın localhost:9000. Bunu yaptığınızda Python bağlantıyı kabul accept()edecek ve geri dönecektir. Üzerinden herhangi bir veri göndermezseniz clientsocket, arayanın soketi bir sonraki sırada zaman aşımına uğrar recv().


Benim için çalışmıyor; bir şeyler eksik. Belki daha s.listen(5)önce s.accept()?
bmaupin

@bmaupin Kulağa makul geliyor, sanırım bunu unuttum. Şimdi düzenledi (ancak 0 biriktirme kuyruğu ile), teşekkürler!
Henrik Heimbuerger

1
Dinlemeyi ve parçaları bir while True:döngüde kabul etmeyi başardım ve test için vurmak için hoş bir dayanıklı zaman aşımı hedefi yapıyor gibi görünüyor.
AlanSE

2
Çalışır, ancak "bağlantı zaman aşımı" ile aynı olmayan "okuma zaman aşımı" hatası verir
timur

13
  • 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.


2
Ben, node.js içinde bağlantıları bir XMLHttpRequest test ettiğimizde (ı kabul cevap yorumladı ettiğimiz gibi) 10.0.0.0ve 10.255.255.255zaman aşımına uğramadan yerine bir EACCES hatası ateş etti. 10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, Ve 192.168.255.255bununla birlikte, zaman aşımı yaptı.
Jamie Birch

9

Herkesin dikkatini patoda işaret etmek istiyorum

Bir yapılandırmayla (örneklerinden alınmıştır) 200:b@100:drrastgele açılan bir bağlantı elde edersiniz.


1
Zaman aşımı ile aynı değil
dentarg

8

Bir yazılım çözümüne ne dersiniz:

SSH sunucusunu uygulama sunucusuna yükleyin. Ardından, yerel bağlantı noktası ile uygulama sunucusundaki uzak bağlantı noktası arasında bir bağlantı oluşturmak için soket tünelini 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ünelini istediğiniz zaman kırabilirsiniz.


4

Etkin bir bağlantı kullanmak istiyorsanız http://httpbin.org/delay/# adresini de kullanabilirsiniz ; burada #, sunucularının yanıt göndermeden önce beklemelerini istediğiniz zamandır. Zaman aşımınız gecikmeden daha kısa olduğu sürece ... etkiyi simüle etmelidir. Başarıyla python istek paketi ile 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 yoktur.


Maks. 10 saniye (Daha yüksek bir sayı koyarsanız, 10 saniye sonra cevap verecektir)
Harry Wood

2

Sunucunun yanıt vermesinin ne kadar süreceğini belirlediğiniz bir API'yi çağırarak yapay olarak kaynak zaman aşımları oluşturmanıza olanak tanıyan hizmetler vardır. Macgyver üzerinde Sunucu Zaman Aşımı böyle bir hizmet örneğidir.

Örneğin, yanıtlanması 15 saniye süren bir isteği test etmek isterseniz, macgyver API'sına bir gönderi isteği yapmanız yeterlidir.

JSON Yükü:

{
    "timeout_length": 15000
}

API Yanıtı (15 saniye sonra):

{
    "response": "ok"
}

Macgyver üzerinde Sunucu Zaman Aşımı programı
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u


1

Sizin için ayrı bir arabirim oluşturacak Microsoft Loopback sürücüsünü yükleyebilirsiniz. Ardından, kendi hizmetinize (kendi ana makinenize) bağlanabilirsiniz. Ardından Ağ Bağlantıları'nda bu arayüzü devre dışı bırakabilir / etkinleştirebilirsiniz ...


1

OP'nin hangisini test etmek istediği tam olarak açık olmasa da, var olmayan bir ana makine / bağlantı noktasına bağlantı kurmakla önceden kurulmuş bir bağlantının zaman aşımı arasında bir fark vardır. Rob ile gidip bağlantı çalışana kadar bekler ve sonra kabloyu çekerdim. Veya - kolaylık olması için - test sunucusu olarak çalışan (köprülü ağa sahip) bir sanal makineye sahip olun ve bağlantı kurulduktan sonra sanal ağ arayüzünü devre dışı bırakın.


1

Rastgele bir bağlantı zaman aşımı benzetimi yapmak için sık kullandığım teknik ssh yerel bağlantı noktası yönlendirme kullanmaktır.

ssh -L 12345:realserver.com:80 localhost

Bu, localhost'taki trafiği yönlendirecektir: 12345, realserver.com:80 İsterseniz, bunu kendi yerel makinenizde de dolaşabilirsiniz:

ssh -L 12345:localhost:8080 localhost

Böylece uygulamanızı localhost ve özel bağlantı noktanıza yönlendirebilirsiniz, böylece trafik hedef ana bilgisayar: bağlantı noktasına yönlendirilir. Daha sonra bu kabuktan çıkabilirsiniz (çıktıktan sonra kabuğu ctrl + c yapmanız gerekebilir) ve uygulamanızın bir bağlantı kaybını görmesine neden olan yönlendirmeyi öldürür.


0

Ağ kablonuzu başka bir bağlantısı / kablosu olmayan bir anahtara takın. Bu işe yaramaz imho.


0

Ağ sorunlarını simüle etmek için geçmişte kullandığım birkaç taktik var;

  1. Ağ kablosunu çıkarın
  2. Makinenizle "hedef" makine arasındaki düğmeyi kapatın (ideal olarak bilgisayarın hala bağlı olduğu anahtarla makinenin "ağ bağlantısını" sürdürmesini sağlayın)
  3. Hedef makinede alınan verileri sessizce düşüren güvenlik duvarı yazılımı çalıştırın

Bu fikirlerden biri, ihtiyacınız olan senaryoyu yapay olarak oluşturmanın bazı yollarını verebilir


0

Hangi güvenlik duvarı yazılımını kurduğunuz / kullanabileceğinize bağlı olarak, giden bağlantı noktasını engelleyebilmelisiniz ve güvenlik duvarınızın kurulumuna bağlı olarak, bağlantı isteği paketini bırakmalıdır. Bağlantı isteği yok, bağlantı yok, zaman aşımı oluşuyor. Bu, yönlendirici düzeyinde uygulanmışsa (sıfırlama göndermek yerine paketleri düşürme eğilimi veya durum için eşdeğer ne olursa olsun) muhtemelen daha iyi çalışır, ancak hile yapacak bir yazılım paketi olması gerekir.


0

En kolay şey CurrPorts kullanarak bağlantınızı bırakmak olacaktır .

Ancak, istisna işleme kodunuzu birim olarak test etmek için, belki de ağ bağlantı kodunuzu soyutlamayı düşünmelisiniz ve talep üzerine istisnalar atan bir saplama, sahte veya dekoratör yazmalısınız. Daha sonra, ağı gerçekten kullanmak zorunda kalmadan uygulama hata işleme mantığını test edebileceksiniz.


CurrPorts ile, sadece bağlantıyı kapatmak mümkün gibi görünüyor (bu sonraki recv()başarısız hemen neden olur), ama bir zaman aşımı taklit etmek için bir yol bulamadı (yani daha fazla veri aktarılır, ancak bağlantı açık kalır).
Henrik Heimbuerger

Talep üzerine bağlantı istisnalarını alay eden bir birim testi önerdiği için bu cevabı takdir ettim.
Danny Bullis

0

Yaptığın aynı çizgide sorunlar yaşadım. Yazılım davranışını test etmek için ağ kablosunu uygun zamanda çıkardım. Kabloyu çıkarmak istemeden hemen önce bir kırılma noktası ayarlamak zorunda kaldım.

Tekrar yapsaydım, bir ağ kablosuna bir anahtar (normalde kapalı anlık bir buton) koyardım.

Fiziksel bağlantı kesme farklı bir davranışa neden olursa, bilgisayarınızı ucuz bir hub'a bağlayabilir ve yukarıda bahsettiğim anahtarı hub'ınız ile ana ağ arasına koyabilirsiniz.

- DÜZENLEME - Çoğu durumda, programınızda belirli bir noktaya gelinceye kadar ağ bağlantısının çalışması gerekir, daha sonra sunulan birçok öneriyi kullanarak bağlantıyı kesmek isteyeceksiniz.


0

Benim için en kolay yol, hedef ağa dayalı ofis yönlendiricisine statik yol eklemekti. Trafiği yanıt vermeyen bazı ana bilgisayarlara yönlendirin (örneğin bilgisayarınız) ve istek zaman aşımı alacaksınız.

Benim için en iyi şey statik rotanın web arayüzü üzerinden yönetilebilmesi ve kolayca etkinleştirilebilmesi / devre dışı bırakılabilmesiydi.


-1

Örneğin bir bağlantı noktasındaki iyi bilinen Web sitelerinden birine bağlanmaya çalışabilirsiniz - örneğin 200. Güvenlik duvarlarının çoğu DROP modunda çalışır ve sizin için bir zaman aşımı simülasyonu yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.