一个(Linux)服务器程序充当它自己的“客户端” [关闭]

A (Linux) server program acting as its own "client" [closed]

提问人:DjVortex 提问时间:11/1/2023 更新时间:11/1/2023 访问量:71

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

21天前关闭。

我有一个(Linux)程序源代码,我需要为它编写自动化单元测试。程序的一部分充当服务器,侦听特定端口(使用 posix 套接字)并向其发送响应。

是否有可能以某种方式让相同的程序充当它自己的“客户端”?换句话说,向该端口发送请求,就好像它是另一台计算机一样,并从同一端口读取响应?如果无法通过使用套接字直接与端口连接来做到这一点,如果可以使用某种特殊文件来做到这一点,那也没关系。

(是的,我知道嘲笑。这不是我要问的。我从字面上问的是上面的问题,没有别的。从字面上看,我需要测试代码才能读取套接字并写入它。

我已经尝试在谷歌上广泛搜索答案,但这再次是谷歌似乎不想给出任何相关答案的问题之一。(所有的结果都只是关于一般的套接字编程,或者同一个程序充当服务器客户端,或者一个服务器用于一个事物,一个客户端用于另一个事物,使用不同的端口,而不是作为“它自己的客户端”。手册页也很长而且很晦涩,很难从中找到这些信息。

C++ C 套接字

评论

0赞 HolyBlackCat 11/1/2023
我想它会起作用,你试过了吗?应该不难测试。
0赞 pptaszni 11/1/2023
"(...)充当自己的“客户”——这个问题对我来说有点晦涩难懂。否则,是的,完全可以将测试数据发送到使用 posix 套接字侦听端口的系统。绝对是的,它可以在您的单元测试中完成。示例(绝对疯狂的猜测):。您在测试系统时遇到了什么问题?std::async(std::launch::async, [](){ socketConnection.sendData(testData); });
2赞 VLL 11/1/2023
这与在同一台计算机上运行两个程序没有什么不同。但是,localhost 上的所有连接都使用环回接口,因此不会访问硬件。因此,根据您的定义“就像是另一台计算机一样”,答案是肯定的或否定的。en.wikipedia.org/wiki/Localhost
0赞 Ulrich Eckhardt 11/1/2023
请阅读您应用的标签的说明!C 和 C++ 通常是互斥的。
0赞 DjVortex 11/1/2023
我添加了这两个标签,因为服务器代码是用 C 编写的,测试代码是用 C++ 编写的(使用 googletest),以防与答案相关。(可能不是,但由于测试程序实际上是用两种语言编写的,我认为这两个标签都适用。

答:

0赞 Christian Stieber 11/1/2023 #1

套接字不关心连接来自哪里,所以它当然有效。

根据服务器架构的不同,它可能会遇到一些实现挑战,比如如果事情不是异步完成的——比如“你的客户端代码将 connect() 连接到套接字并等待它成功,但由于它正在等待连接,服务器的服务器部分无法接受它”。您的代码必须能够并行运行这两件事。

但是,只要嵌入式客户端代码不对服务器代码进行实际调用,就可以将客户端作为新线程启动。注意某些在静态缓冲区中返回内容的 libc 调用。核心套接字部分通常不会发生,但为日志制作漂亮的时间戳之类的事情可以调用此类函数。

这将解决此类问题,并且如果您愿意,还可以以阻塞方式实现客户端。

更新:请记住,这样的内置“测试”无法找到各种东西:

  • 它无法找到网络问题,因为它没有通过网络
  • 它无法报告服务器崩溃,因为客户端将随之崩溃

评论

0赞 DjVortex 11/1/2023
我以某种方式假设同一个程序试图从两个不同的位置读取/写入相同的端口只会搞砸自己,但它确实似乎是这样,两个不同的套接字实例可以通过同一个端口相互通信,因此它是完美的解决方案(需要注意的是,您提到的这实际上并没有测试网络连接本身。
0赞 Jerry Coffin 11/1/2023
@DjVortex:它实际上确实经历了相当多的网络堆栈 - 它只是使用环回适配器而不是硬件适配器。