如何在C中检测程序是否与自身连接。
例如,我在端口1234上设置了一个监听器,然后我设置另一个套接字连接到端口1234上的任意地址。我想检测我是否连接到我自己的程序。有什么办法吗?
谢谢, 戴夫
答案 0 :(得分:1)
Linux提供了我认为可以解决这个问题的工具。如果连接到同一台机器,则可以运行
fuser -n tcp <port-number>
并获取侦听该端口的进程列表。然后,您可以查看/proc
并查明是否存在一个没有您自己的pid的进程,它正在运行您所使用的相同二进制文件。一点口香糖和打包线将有助于将整个装置保持在一起。
我认为你不能轻易在另一台机器上询问有关流程的问题。
答案 1 :(得分:1)
accept()
函数的一个参数是指向struct sockaddr
的指针。
当您在服务器端调用accept()
时,它将填写连接到服务器套接字的远程计算机的地址。
如果该地址与该计算机上任何接口的地址匹配,则表明该客户端与服务器位于同一台计算机上。
答案 2 :(得分:0)
您可以在连接时发送一系列魔术包,这是以确定的方式计算的。诀窍是如何以发送方和接收方始终计算相同数据包内容的方式执行此操作,如果它们来自同一个程序实例。关于你的程序的更多信息在这里会有所帮助,但很可能你可以在一堆程序状态上做一些哈希,并为程序实例提供一些相当独特的东西。
答案 3 :(得分:0)
我认为你的意思不仅仅是同一个程序,而是在同一台机器上运行的相同实例。
您是否关心通过网络连接回自己的情况(也许您有两个网卡,或一个端口转发路由器,或某些网络上的某些异常路由)?
如果没有,您可以检查任意地址是否解析为环回(127.0.0.1),或者您知道的任何其他IP地址。我不是网络专家,所以我可能错过了一些可能性。
如果您关心“间接环回”的情况,请做一些握手,包括两个端点通过内存共享的随机生成的数字。我不知道您的情况是否存在安全问题:如果是这样,请记住,除非您也确保连接,否则这几乎肯定会受到MITM的影响。