2010-01-14 88 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

我开车被测代码连接到一个“模拟”我的套接字代码的单元测试可能是更好的描述为集成测试远程对等。由于远程对等体处于测试的控制之下(它只是一个简单的客户机或服务器),我可以让测试使远程对等体以各种方式破坏连接,然后确保被测代码按预期做出反应。它需要一些工作来设置,但是一旦你完成了所有的工作,就可以测试大多数情况。

所以,我想,我的建议是,而不是试图模拟你遇到的情况,你应该了解它们,然后可靠地生成它们。