我有一个使用套接字的功能,我会嘲笑但我无法找到它。
有没有办法在C中模拟套接字?
由于
答案 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套接字,或者您可以将套接字连接回本地测试夹具通过环回接口。或者,虽然我不知道任何示例,但原则上您还可以找到或编写一个驱动程序,为人工,目的地址系列提供套接字。