【问题标题】:Getting the socket FD from IP address and port从 IP 地址和端口获取套接字 FD
【发布时间】:2010-07-29 15:29:24
【问题描述】:

他们是否是一种获取给定IP addr & port 的 FD 的方法(除了在所有打开的 FD 上循环)? 我有一堆打开的 UDP 套接字,每个套接字都绑定到一个 IP 地址和端口。在某些情况下,该应用程序充当前向应用程序。他们是 getfdbyname 系统调用吗?

具体来说,我的 UDP 应用程序(C)位于节点 A 和 B 之间。

1) A 使用source Port 2000destination port 3000 向C 发送消息,C 收到该消息

2) C 然后必须使用端口 2000 将其转发到节点 B 的 port 3000

在第 1 步,绑定到port 3000 的打开的套接字接收到一条消息。但是,此时我需要获取port 2000的socket绑定的FD来转发消息。

除了遍历所有已配置的套接字之外还有什么想法吗?

【问题讨论】:

    标签: linux sockets udp


    【解决方案1】:

    您可以保留地址哈希 => 套接字映射。

    我通常做的是有一个由地址和套接字 FD 组成的结构,代表我与之通信的主机。然后我有一个查找函数,它通过地址查找该结构。

    【讨论】:

    • 这是正确的答案 - “在创建套接字时跟踪它”。
    • 是的 - 如果您的应用程序想要这样做,它需要跟踪它。您可以使用 STL 容器(例如 map),并将地址/端口对作为键。
    【解决方案2】:

    您可以查看strace netstat -anlp,这表明您可以查看/proc/net/udp 以查找所有套接字的列表,如下所示:

    sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode  
    53: 0100007F:0035 00000000:0000 07 00000000:00000000 00:00000000 00000000   103        0 11075 2 ffff1231230f90c0 
    

    这显示了“某个进程”如何在 UDP 端口 53 上进行侦听(对于慢速阅读器,0x0035 == 53 和 0x0100007F 是 localhost)

    inode (11075) 是指向 fd 的链接。查看/proc/<bindpid>/fd/,我们看到:

    ...
    lrwx------ 1 bind bind 64 2010-07-20 06:26 513 -> socket:[11075]
    ...
    

    所以 fd 是 513。我不是建议你遵循这条路线,但我认为这至少是获得你所要求的东西的一种方式。

    【讨论】:

      【解决方案3】:

      不,没有这样的调用,但是使用 UDP,您不需要为每个目标主机/端口使用单独的套接字 - 这就是 sendto(3) 的用途(除非您实际上是 connect(2) 您的 UDP 套接字)。

      【讨论】:

      • 我对更改我发送的每个数据报的源 IP/端口更感兴趣
      • 嗯,如果您将其发送出去,源 IP/端口 将自动更改,因为它是从不同的主机/端口发送的。我在这里谈论您的应用程序 C - 只需使用 一个 出站套接字并将目标 IP/端口更改为您需要的任何内容。
      • 我希望源 IP/端口更改为我想要的,而不是内核填写的内容。如果我从 srcPort 2000 接收到我在 5000 上的监听端口的消息,我需要从 srcPort 转发此消息2000 到对端的 dest 端口 5000
      • 据我记忆,您可以将bind(2) UDP 套接字重新发送到不同的端口。这会给你你想要的。
      • @Aditya:那我建议再开一个问题!但简而言之:您可能正在寻找一个原始套接字,您可以使用它以您认为合适的方式发送原始 ip 数据包(包括您想要的 IP+UDP 标头),使用socket(PF_INET,SOCK_RAW,IPPROTO_IP)
      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2012-04-27
      • 2019-08-28
      • 2010-12-26
      • 2014-12-29
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多