C语言 如何拒绝通过已建立的TCP连接流动的数据,但套接字连接应保持有效状态



我需要一种情况,其中已建立的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这样的东西来强调你的代码。

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

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

最新更新