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