如何在C语言中模拟socket

7

我有一个使用socket的函数,我想模拟它,但我不知道如何实现。

在C语言中有没有一种方法可以模拟sockets?

谢谢。


没错,我用词不当,我指的是函数。 - pBouillon
@Joe 我会说在C语言中,方法和同义词。 - Badda
@Badda 是的,但这也是某人在 SO 上混淆了 C++ 和 C 而实际上询问 C 的迹象!我只是想要澄清。 - Joe
1
@Badda:一个方法是一个函数,但反之不成立! - too honest for this site
2
我不同意,@Badda。在C的词汇表中没有术语“method”。在C++中,该术语是有意义的,它指代了一些在C中没有类似物的东西。我承认,在C的上下文中,我们通常理解某人说“method”的意思,但它并不是“function”的真正同义词。它的使用可能是混乱思维的一个症状,无论是C和C++之间的混淆还是其他原因。 - John Bollinger
显示剩余2条评论
2个回答

12

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

假设您想测试以下函数:

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:


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函数而不是库函数。

这种技术不仅适用于套接字函数,还适用于系统/库函数。


谢谢,这非常有用。使用相同的方法对于 sendrecv 也可以工作吗? - pBouillon
@Default 是的,你几乎可以使用任何库函数来完成相同的操作。 - dbush

0

套接字由内核管理,因此没有仅限于用户空间的伪造机制,但是您可以设置一个真实的套接字连接到测试夹具的一部分。

特别的,您可以使用 unix 域或原始套接字来完成这个目的,在测试时,您需要与代码下的 TCP 套接字工作,或者通过回环接口将套接字连接回本地测试夹具。或者,尽管我不知道任何例子,原则上您也可以找到或编写一个驱动程序提供用于人造、专用地址族的套接字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接