2010-01-14 90 views
6

如何模擬套接字錯誤? (有時服務器或客戶端由於某些套接字錯誤而斷開連接,並且無法重現。) 我正在尋找一個工具來執行此操作,但找不到一個工具。 有沒有人知道任何一種工具或有關於如何做到這一點的代碼示例? (C#或C/C++)模擬套接字錯誤

+2

拔下網線? – Eclipse 2010-01-14 20:32:53

回答

6

向您用於訪問套接字的API添加包裝層,使它們失敗rand()%100> x%的時間。

+0

好吧,不知道如何做到這一點..失敗的一部分.. – ra170 2010-02-01 19:57:45

+0

@ ra170在你的包裝函數,而不是調用通過真正的函數,讓它返回任何錯誤代碼意味着「失敗」的API的某些部分時間 – 2010-02-02 20:59:12

1

今年夏天我的問題完全一樣。

我有一個自定義Socket類,想測試如果readwrite拋出異常會發生什麼。我真的很想模仿的Java嘲弄的框架,而我卻這樣說:

我繼承了Socket類成FakeSocket類,並創建了一種叫SocketExpectation。然後,在單元測試中,我創建了僞套接字,設置了期望值,然後將該僞套接字傳遞給我想測試的代碼。

FakeSocket有這些方法(剝離不需要的細節):

uint32_t write(buffer, length); // calls check 
uint32_t read(buffer, length); // calls check 
bool matches(); 
void expect(expectation); 
uint32_t check(CallType, buffer, length) const; 

他們都非常直截了當。 check根據當前期望檢查參數,如果一切都按照計劃進行,則繼續執行SocketExpectation要求。

SocketExpectation有這個綱要(扒):

typedef enum { write, read } CallType; 

SocketExpectation(CallType type); 
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args 
SocketExpectation &will_return(uint32_t value); 
SocketExpectation &will_throw(const char * e); // test error handling 
bool matches(); 

我增加了更多的方法,因爲我需要他們。謹以此創建它,然後將假插座傳遞給相關的方法:

fake_socket = FakeSocket(); 
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...)); 
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something")); 
+0

讀取和寫入不能拋出異常 – 2010-01-14 21:04:44

+0

這是一個自定義套接字類,如果連接發生任何意外事件,它會引發異常。 – laura 2010-01-14 21:07:18

0

我開車被測代碼連接到一個「模擬」我的套接字代碼的單元測試可能是更好的描述爲集成測試遠程對等。由於遠程對等體處於測試的控制之下(它只是一個簡單的客戶機或服務器),我可以讓測試使遠程對等體以各種方式破壞連接,然後確保被測代碼按預期做出反應。它需要一些工作來設置,但是一旦你完成了所有的工作,就可以測試大多數情況。

所以,我想,我的建議是,而不是試圖模擬你遇到的情況,你應該瞭解它們,然後可靠地生成它們。