我需要一种情况,其中已建立的TCP连接会给出一些错误,例如sendto()失败或receive(),但套接字连接应保留在原位。 这样,我想检查我的应用程序中是否有任何数据发送和接收失败一两次,然后它将如何表现。 最初,我通过对这些值进行编码对其进行了测试,但现在我想在实时场景中看到它。
提前谢谢。
我不认为你可以让发送/接收行为成为你真正的想法,但可能有一个解决方法。
您可以定义全局标志,并设置信号处理程序以更改标志值。然后在 shell 中,您可以将信号发送到您的应用程序以更改标志值。通过判断标志值,可以使程序在实时场景中进入错误测试用例:
全局标志和信号处理程序:
int link_error = 0;
static void handler(int sig)
{
link_error = 1; /* indicating error happens */
}
在main()中设置一个信号,例如SIGUSR1(LINUX X86中值为10的宏),
struct sigaction sa = {0};
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if(sigaction(SIGUSR1, &sa, NULL) == -1)
return -1;
然后重新定义要测试的函数,如 send() 来判断标志值:
int send_test(...)
{
/* Link error happens */
if(link_error) {
link_error --;
return -1;
}
return send(...);
}
当你的程序运行时,你可以随时通过kill -s 10 xxx(xxx是你的程序pid)来进行测试。
我不完全确定我是否关注你,但是...
尝试从您正在与之通信的设备(而不是运行代码的计算机)拔下网线。这是一个失败的案例。你也可以为另一端编写一些测试应用程序,故意停止或关闭 wr 或 rd;更改套接字的 TX 和 Rx 缓冲区的大小将允许您快速填充它们并因此查看停顿。您可能还可以做其他事情,例如使您的 MTU 非常小,这通常会测试代码中的一堆假设。你也可以在混合中填充像WanEm这样的东西来强调你的代码。
网络中有很多失败案例需要测试,对此没有简单的答案。
如果在套接字连接上收到除读取超时以外的任何错误,则连接将断开。它不会"留在原地"。因此,您不能在应用程序中引起这种情况。您所能做的就是将发送端保持足够长的时间以引起读取超时。