提问人:DjVortex 提问时间:11/1/2023 更新时间:11/1/2023 访问量:71
一个(Linux)服务器程序充当它自己的“客户端” [关闭]
A (Linux) server program acting as its own "client" [closed]
问:
我有一个(Linux)程序源代码,我需要为它编写自动化单元测试。程序的一部分充当服务器,侦听特定端口(使用 posix 套接字)并向其发送响应。
是否有可能以某种方式让相同的程序充当它自己的“客户端”?换句话说,向该端口发送请求,就好像它是另一台计算机一样,并从同一端口读取响应?如果无法通过使用套接字直接与端口连接来做到这一点,如果可以使用某种特殊文件来做到这一点,那也没关系。
(是的,我知道嘲笑。这不是我要问的。我从字面上问的是上面的问题,没有别的。从字面上看,我需要测试代码才能读取套接字并写入它。
我已经尝试在谷歌上广泛搜索答案,但这再次是谷歌似乎不想给出任何相关答案的问题之一。(所有的结果都只是关于一般的套接字编程,或者同一个程序充当服务器或客户端,或者一个服务器用于一个事物,一个客户端用于另一个事物,使用不同的端口,而不是作为“它自己的客户端”。手册页也很长而且很晦涩,很难从中找到这些信息。
答:
套接字不关心连接来自哪里,所以它当然有效。
根据服务器架构的不同,它可能会遇到一些实现挑战,比如如果事情不是异步完成的——比如“你的客户端代码将 connect() 连接到套接字并等待它成功,但由于它正在等待连接,服务器的服务器部分无法接受它”。您的代码必须能够并行运行这两件事。
但是,只要嵌入式客户端代码不对服务器代码进行实际调用,就可以将客户端作为新线程启动。注意某些在静态缓冲区中返回内容的 libc 调用。核心套接字部分通常不会发生,但为日志制作漂亮的时间戳之类的事情可以调用此类函数。
这将解决此类问题,并且如果您愿意,还可以以阻塞方式实现客户端。
更新:请记住,这样的内置“测试”无法找到各种东西:
- 它无法找到网络问题,因为它没有通过网络
- 它无法报告服务器崩溃,因为客户端将随之崩溃
评论
std::async(std::launch::async, [](){ socketConnection.sendData(testData); });