2

I need a case where established TCP connection give some errors , like either sendto() failed or recieve() but socket connection should remain in place. this way i want to check if in my application any data sending and recieving failes for one or twice , then how it will behave. Initially, i have tested it by harcoding these values but now i want to see it in real time scenario.

Thanks in Advance.

4

3 回答 3

0

如果您在套接字连接上收到读取超时以外的任何错误,则连接已断开。它不会“留在原地”。因此,您不能在您的应用程序中引发这种情况。您所能做的就是让发送端保持足够长的时间以引发读取超时。

于 2013-09-10T13:26:32.220 回答
0

我不认为您可以按照您的想法进行发送/接收,但可能有一种解决方法。

您可以定义一个全局标志,并设置一个信号处理程序来更改标志值。然后在 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) 进行测试。

于 2013-09-10T18:14:18.517 回答
0

我不完全确定我是否跟随你,但...

尝试从您正在与之交谈的设备上拔下网络电缆,而不是从您正在运行代码的机器上拔下。这是一个失败案例。您还可以为另一端编写一些测试应用程序,故意停止或关闭 wr 或 rd;更改套接字的 tx 和 rx 缓冲区的大小将允许您快速填充它们并因此看到停顿。您可能还可以做其他事情,例如使您的 MTU 非常小,这通常会测试代码中的一堆假设。你也可以在混合中加入类似WanEm的东西来强调你的代码。

网络中有很多失败案例需要测试,对此没有简单的答案。

于 2013-09-10T13:15:57.700 回答