我有一个使用socket的函数,我想模拟它,但我不知道如何实现。
在C语言中有没有一种方法可以模拟sockets?
谢谢。
我有一个使用socket的函数,我想模拟它,但我不知道如何实现。
在C语言中有没有一种方法可以模拟sockets?
谢谢。
大多数系统/库函数是弱符号,这意味着您可以创建自己的实现来覆盖现有版本。然后,在单元测试中使用这些功能。
假设您想测试以下函数:
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
函数而不是库函数。
这种技术不仅适用于套接字函数,还适用于系统/库函数。
send
或 recv
也可以工作吗? - pBouillon套接字由内核管理,因此没有仅限于用户空间的伪造机制,但是您可以设置一个真实的套接字连接到测试夹具的一部分。
特别的,您可以使用 unix 域或原始套接字来完成这个目的,在测试时,您需要与代码下的 TCP 套接字工作,或者通过回环接口将套接字连接回本地测试夹具。或者,尽管我不知道任何例子,原则上您也可以找到或编写一个驱动程序提供用于人造、专用地址族的套接字。