如何在RHEL c / cpp应用程序上测试连接超时

时间:2011-09-02 13:53:43

标签: c++ unit-testing tcp timeout

我有一个通过HTTP与服务器通信的应用程序。我编写了一个代码来控制连接超时(它在服务器回复之前等待的时间)。但我发现很难生成一个测试用例来测试我的连接超时代码。你能帮我吗?

基本上,TCp握手将包含 主机A向主机B发送TCP SYNchronize数据包

主机B收到A的SYN

主机B发送SYNchronize-acknowledge

主机A接收B的SYN-ACK

主机A发送确认

主机B收到ACK。 TCP套接字连接是ESTABLISHED。

在我的应用程序中,如果服务器在x秒内未完成TCP握手,则应用程序将移至下一个服务器。但是为了测试这段代码,我需要一个服务器存根,它可能会接受来自客户端的SYN数据包,但不会将SYN + ACK数据包设置到客户端。从而使客户端等待服务器的回复。

请你帮我创建一个小服务器存根,它将监听特定端口,但不会完成握手。

2 个答案:

答案 0 :(得分:2)

鉴于您提到RHEL,我认为您最好使用iptables来帮助测试。例如,你可以打电话:

iptables -I INPUT -s hostb -d hosta -p tcp --dport $port --tcp-flags SYN,ACK SYN,ACK -j DROP

在运行测试之前调用它(或者甚至可能在它期间?)和等效的匹配-X来删除它似乎是到目前为止中断握手的最简单方法。

删除所有SYN + ACK(警告,打破新的SSH连接):

iptables -I INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -j DROP

从10.10.22.34删除所有内容:

iptables -I INPUT -s 10.10.22.34 -j DROP
iptables -I OUTPUT -d 10.10.22.34 -j DROP

就个人而言,我会使用您可能编写的最具体的匹配,以避免意外地同时破坏远程访问或其他任何内容。

您可以变得更加漂亮并使用-m owner匹配仅将此规则应用于运行此测试的UID的数据包。

答案 1 :(得分:1)

我不会依赖iptables或任何其他工具进行单元测试,因为这些测试太脆弱了。如果IP地址发生变化,或者单元测试是在另一台机器上运行怎么办?如果代码必须移植到iptables不可用的操作系统上,该怎么办?

为了使单元测试与网络隔离,我将套接字API封装在Socket类中。然后我会有一个使用Connection类的Socket类。我将使用Connection类(来自TimeoutSocket)对Socket类进行单元测试,该类模拟服务器不接受第一个连接请求。

您的代码不应该依赖于线路上发生的事情。