2008-09-19 105 views
215

我收到連接超時時發生了軟件中的錯誤。這些錯誤非常罕見(通常當我的內部網絡連接斷開時)。我怎麼能人爲地產生這種效果,所以我可以測試我們的軟件?人爲創建連接超時錯誤

如果有問題,應用程序是使用CAsyncSocket類在C++/MFC中編寫的。

編輯:

我用一個不存在的主機嘗試,我也得到了套接字錯誤:

WSAEINVAL (10022) Invalid argument

我的下一個嘗試是使用連接的Alexander的建議一個不同的端口,例如81(儘管我自己的服務器上)。這很好。與丟棄的連接完全相同(60秒等待,然後錯誤)。謝謝!

回答

220

連接到現有主機,但連接到防火牆阻止的端口,該端口只會丟棄TCP SYN數據包。例如,www.google.com:81。

+4

這個答案很簡單,就像@ emu的答案一樣。我明白這個答案並不打算建議使用google.com:81,但這裏的要點是使用被阻止的不同端口。所以你總是可以使用。 – 2014-08-14 03:58:33

+2

除非它是你自己的服務器,否則它無法擊中其他服務器進行測試。使用像下面提到的那個emu這樣的文明解決方案,通過點擊不可路由的IP地址(如10.255.255.1),或者爲了測試目的而設置您自己的虛擬服務器。 – zeeshan 2015-04-09 15:19:06

+2

我認爲谷歌可能已經阻止了這個端口。當我使用Chrome進行測試時,我只是「服務器不可用」。當我在下面使用@ emu的技巧時,連接按預期掛起。我錯過了什麼嗎? – entpnerd 2015-12-09 21:48:30

0

將網絡電纜插入沒有其他連接/電纜的交換機。這應該工作恕我直言。

1

過去有幾種策略用於模擬網絡問題;

  1. 拔出網線
  2. 關掉開關(最好用計算機插入仍在供電,因此該機保持它的「網絡連接」的開關),機器和「目標」之間這會丟棄收到的數據
  3. 在目標機器上機
  4. 運行防火牆軟件

其中的一個想法可能給你一些手段人爲地產生的情況下,你需要

0

根據您已安裝/可用的防火牆軟件,您應該能夠阻止出站端口,並且取決於防火牆的設置方式,應該放棄連接請求數據包。沒有連接請求,沒有連接,超時發生。如果它是在路由器級別實現的話,這可能會更好(它們傾向於丟棄數據包而不是發送重置,或者相當於這種情況),但肯定會有一個軟件包可以做到這一點。

0

我的問題與您所做的相同。爲了測試軟件的行爲,我只是在適當的時候拔掉了網線。在我想拔下電纜之前,我必須設置一個斷點。

如果我再次這樣做,我會在網線中放置一個開關(一個常閉瞬時按鈕)。

如果物理斷開連接導致不同的行爲,可以將計算機連接到便宜的集線器,並將上述交換機連接到集線器和主網絡之間。

- 編輯 - 在許多情況下,您需要網絡連接工作,直到您的程序中的某個點,然後您需要使用提供的許多建議之一斷開連接。

-1

你可以嘗試連接到的可能不是從外部端口上知名網站的一種 - 200爲例。大多數防火牆在DROP模式下工作,它會模擬你的超時時間。

-1

最簡單的事情將是使用拖放您CurrPorts連接。

但是,爲了進行單元測試你的異常處理代碼,也許你應該考慮抽象您的網絡連接代碼,寫一個存根,模擬或裝飾會拋出異常的需求。然後,您將能夠測試應用程序錯誤處理邏輯,而無需實際使用網絡。

+0

使用CurrPorts,我似乎只能關閉連接(導致下一個`recv()`立即失敗),但找不到一種模擬超時的方式(即不再傳輸數據,但連接保持打開狀態)。 – 2013-04-16 21:56:28

1

您可能會安裝Microsoft Loopback驅動程序,它將爲您創建一個單獨的界面。然後你可以連接到你的一些服務(你自己的主機)。然後,在網絡連接,您可以禁用/啓用這樣的接口...

1

儘管它並不完全清楚哪一個OP想要測試:有嘗試一個不存在的主機/端口和連接之間的差異已建立連接的超時。我會和Rob一起去,等到連接正常後再拔電纜。或者 - 爲了方便起見 - 將虛擬機作爲測試服務器(具有橋接網絡),並且只要連接建立就停用虛擬網絡接口。

363

連接到非可路由的IP地址,如10.255.255.1。

+11

同樣,我想這是一個更好的答案,因爲google.com:81可能有一天可以到達。 – Gui13 2012-01-27 15:00:32

8

軟件解決方案如何:

在應用程序服務器上安裝SSH服務器。然後,使用套接字隧道在您的本地端口與應用程序服務器上的遠程端口之間創建鏈接。您可以使用ssh客戶端工具來執行此操作。讓您的客戶端應用程序連接到您映射的本地端口。然後,您可以隨意中斷套接字隧道以模擬連接超時。

15

可以使用Python REPL模擬超時而接收數據(連接已經成功地建立,即後)。只需要一個標準的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() 

現在它等待傳入連接。連接任何你想測試localhost:9000。當你這樣做時,Python將接受連接,並且accept()將返回它。除非通過clientsocket發送任何數據,否則在下一個recv()期間,主叫方的套接字應該超時。

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

,所有這些都是不可路由。

19

如果你是在UNIX機器上,你就可以開始使用端口監聽的netcat:

nc -l 8099 

然後,修改你的服務調用不管它通常不會到該端口例如http://localhost:8099/some/sort/of/endpoint

然後,您的服務將打開連接和寫入數據,但永遠不會得到響應,所以會給你一個讀超時(而不是拒絕連接)

0

對我來說,最簡單的方法是添加靜態基於目標網絡的辦公室路由器上的路由。只需將流量路由到某些無響應的主機(例如您的計算機),您將獲得請求超時。

對我來說最好的事情是靜態路由可以通過Web界面進行管理,並且可以輕鬆啓用/禁用。

3

如果您想要使用活動連接,您還可以使用http://httpbin.org/delay/#,其中#是希望服務器在發送響應之前等待的時間。只要你的超時時間短於延遲...應該模擬效果。我已經成功地將它與python requests包一起使用。

如果您發送任何敏感內容,您可能需要修改您的請求 - 不知道發送給它們的數據會發生什麼情況。

1

有些服務可讓您通過調用指定服務器響應的時間長度的API來人工創建原點超時。在macgyver上的服務器超時是這種服務的一個例子。

例如,如果您想測試需要15秒才能響應的請求,則只需向macgyver API發出發佈請求即可。

JSON有效載荷:

{ 
    "timeout_length": 15000 
} 

API響應(15秒後):上百戰天龍

{ 
    "response": "ok" 
} 

服務器超時程序
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

10

以下URL總是給人一種超時,和結合了@Alexander和@Emu的最佳答案:

http://example.com:81

使用example.com:81是亞歷山大的回答的改進,因爲example.com是由DNS標準保留,所以它永遠是不可到達的,不像google.com:81,如果谷歌感覺就像它可能改變。另外,由於example.com被定義爲無法訪問,因此您不會淹沒Google的服務器。

我認爲這是對@ emu答案的改進,因爲它更容易記住。