我如何拒绝在已建立的TCP连接上流动的数据,但套接字连接应保持有效状态。

时间:2013-09-10 13:09:19

标签: c linux sockets tcp network-programming

我需要一个已建立的TCP连接会出现一些错误的情况,例如sendto()失败或收到(),但套接字连接应保持不变。    这样我想检查在我的应用程序中是否有任何数据发送和接收一两次失败,然后它将如何表现。    最初,我已经通过对这些值进行了测试来测试它,但现在我想在实时场景中看到它。

先谢谢。

3 个答案:

答案 0 :(得分:0)

我不完全确定我会关注你但是......

尝试从正在与之通话的设备上拔下网线,而不是从正在运行代码的设备上拔下网线。这是一个失败案例。您还可以为另一端编写一些测试应用程序,故意停止或关闭wr或rd;改变tx&的大小套接字的rx缓冲区将允许您快速填充它们并查看停顿结果。您可能还可以做其他事情,例如使您的MTU非常小,通常在代码中测试一堆假设。您还可以在混合中添加类似WanEm的内容来强调您的代码。

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

答案 1 :(得分:0)

如果在读取超时之外的套接字连接上出现任何错误,则连接断开。它不会“留在原地”。你不能在你的申请中引起这样的情况。您所能做的就是将发送端保持足够长的时间以引起读取超时。

答案 2 :(得分: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)进行测试。