如何在C中模拟套接字

时间:2017-05-19 14:57:51

标签: c sockets testing networking mocking

我有一个使用套接字的功能,我会嘲笑但我无法找到它。

有没有办法在C中模拟套接字?

由于

2 个答案:

答案 0 :(得分:6)

大多数系统/库函数都是weak symbols。这意味着您可以创建自己的实现,以覆盖现有版本。然后,您可以在单元测试时使用这些功能。

假设您要测试以下功能:

src.c:

int get_socket()
{
    int s;

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == -1) {
        perror("socket failed");
    } else {
        printf("socket success\n");
        close(s);
    }
    return s;
}

然后,您将在单独的源文件中创建模拟函数(以及任何控制变量):

mock_socket.c:

int sock_rval;

int socket(int domain, int type, int protocol)
{
    printf("calling mock socket\n");
    return sock_rval;
}

然后在另一个文件中进行测试:

test_socket.c:

extern int sock_rval;
int get_socket();

int main()
{
    sock_rval = -1;
    int rval = get_socket();
    assert(rval == -1);
    sock_rval = 3;
    int rval = get_socket();
    assert(rval == 3);
    return 0;
}

然后,您将编译这三个模块并将它们链接在一起。然后get_socket将调用mock_socket.c中的socket函数而不是库函数。

这种技术不仅适用于套接字函数,而且适用于一般的系统/库函数。

答案 1 :(得分:0)

套接字由内核管理,因此没有用于模拟它们的仅用户空间机制,但是您可以设置连接到端点的真正套接字,该端点是测试夹具的一部分。

特别是,您可以使用unix-domain或raw套接字来测试代码通常具有的TCP套接字,或者您可以将套接字连接回本地测试夹具通过环回接口。或者,虽然我不知道任何示例,但原则上您还可以找到或编写一个驱动程序,为人工,目的地址系列提供套接字。