c - 如何在 C 中模拟套接字

标签 c sockets testing networking mocking

我有一个使用套接字的函数,我想模拟它,但我找不到如何去做。

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

谢谢

最佳答案

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

假设您要测试以下功能:

源文件:

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;
}

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

模拟套接字.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函数,而不是库函数。

此技术不仅适用于套接字函数,而且通常适用于系统/库函数。

关于c - 如何在 C 中模拟套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073243/

相关文章:

php - 每次 PHPUnit 测试后换行

linux - GNU/Linux 的 HTTP 请求生成器?

c - 16 位数字相加、查找表、二进制加法或简单加法的最有效方法?

c - 为什么 5/7 打印 0?

python - 何时以及为何 socket.send() 在 python 中返回 0?

c - 通过 SSL 套接字反向 shell

android - 使用 Espresso 测试 Activity 和特定 fragment

c - 返回一个数组

c - 具有最小内存占用的程序(在 Linux 上)

客户端有关recvfrom函数的问题