【问题标题】:Detect whether a socket program is connecting to itself检测socket程序是否连接到自己
【发布时间】:2009-04-05 22:36:40
【问题描述】:

如何在 C 中检测程序是否正在连接到自身。

例如,我在端口 1234 上设置了一个侦听器,然后我设置了另一个套接字来连接到端口 1234 上的任意地址。我想检测我是否正在连接到我自己的程序。有什么办法吗?

谢谢, 戴夫

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    Linux 提供了我认为可以解决这个问题的工具。如果连接的是同一台机器,可以运行

    fuser -n tcp <port-number>
    

    并取回监听该端口的进程列表。然后,您可以查看/proc 并确定是否有一个进程的 pid 不是您自己的,它正在运行与您相同的二进制文件。一点口香糖和打包线将有助于将整个装置保持在一起。

    我认为你不能轻易就另一台机器上的进程提出问题。

    【讨论】:

    • 您可以让其他进程请求您并回复。
    【解决方案2】:

    accept() 函数的参数之一是指向struct sockaddr 的指针。

    当您在服务器端调用accept() 时,它将填写连接到您的服务器套接字的远程机器的地址。

    如果该地址与该机器上任何接口的地址匹配,则表明客户端与服务器位于同一台机器上。

    【讨论】:

      【解决方案3】:

      您可以在连接时发送一系列魔术数据包,这是以确定性方式计算的。诀窍是如何做到这一点,如果发送者和接收者来自相同的程序实例,它们将始终计算相同的数据包内容。关于你的程序是什么的更多信息在这里会有所帮助,但很可能你可以对一堆程序状态进行某种散列,并提出对该程序实例相当独特的东西。

      【讨论】:

      • 我正在编写一个简单的透明 HTTP 代理服务器,但想防止客户端在尝试连接到服务器地址时崩溃或最大化代理。
      • @Matt J:为什么不发送 PID?
      • @yves:PID 将唯一标识单台机器中的实例,但“随机地址”部分让我认为这将在多台机器上运行,您可能会遇到 PID 冲突,尤其是频繁重启;-)
      【解决方案4】:

      我假设您的意思不仅仅是同一个程序,而是在同一台机器上运行的同一个实例。

      您是否关心您通过网络连接回自己的情况(可能您有两个网卡,或者一个端口转发路由器,或者某处互联网上的一些不寻常的路由)?

      如果不是,您可以检查任意地址是否解析为环回 (127.0.0.1),或者您知道的任何其他 IP 地址。我不是网络专家,所以我可能错过了一些可能性。

      如果您确实关心“间接环回”情况,请进行一些握手,包括两个端点通过内存共享的随机生成的数字。我不知道您的情况是否存在安全问题:如果有,请记住,除非您还保护连接,否则这几乎肯定会受到 MITM 的约束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-13
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2013-07-01
        相关资源
        最近更新 更多