gpt4 book ai didi

c++ - 如何在 C 中 stub 套接字?

转载 作者:可可西里 更新时间:2023-11-01 16:41:20 26 4
gpt4 key购买 nike

我编写的客户端代码应该通过套接字发送一些数据并从远程服务器读回一个答案。

我想对该代码进行单元测试。该函数的签名类似于:

double call_remote(double[] args, int fd);

其中 fd 是到远程服务器的套接字的文件描述符。

现在 call_remote 函数将在发送数据后阻止从服务器读取答案。如何 stub 这样的远程服务器以对代码进行单元测试?

理想情况下我想要这样的东西:

int main() {
int stub = /* initialize stub */
double expected = 42.0;

assert(expected == call_remote(/* args */, stub);

return 0;
}

double stub_behavior(double[] args) {
return 42.0;
}

我希望调用 stub_behavior 并将 42.0 值发送到 stub 文件描述符中。

有什么简单的方法可以做到吗?

最佳答案

如果这是一个 POSIX 系统,你可以使用 fork()socketpair():

#define N_DOUBLES_EXPECTED 10
double stub_behaviour(double []);

int initialize_stub(void)
{
int sock[2];
double data[N_DOUBLES_EXPECTED];

socketpair(AF_UNIX, SOCK_STREAM, 0, sock);

if (fork()) {
/* Parent process */
close(sock[0]);
return sock[1];
}

/* Child process */

close(sock[1]);

/* read N_DOUBLES_EXPECTED in */
read(sock[0], data, sizeof data);

/* execute stub */
data[0] = stub_behaviour(data);

/* write one double back */
write(sock[0], data, sizeof data[0]);
close(sock[0]);
_exit(0);
}


int main()
{
int stub = initialize_stub();
double expected = 42.0;

assert(expected == call_remote(/* args */, stub);

return 0;
}

double stub_behavior(double args[])
{
return 42.0;
}

...当然,您可能希望添加一些错误检查,并更改读取请求的逻辑。

socketpair() 创建的文件描述符是一个普通的套接字,因此像 send()recv() 这样的套接字调用将好好工作吧。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com