从IP地址和端口获取插槽FD

时间:2010-07-29 15:29:25

标签: linux sockets udp

他们是一种方式(除了在所有开放的FD上循环)以获得给定IP addr & port的FD吗? 我有一堆开放的UDP套接字,每个套接字绑定到一个IP地址&港口。在某些情况下,应用程序充当转发应用程序。他们是 getfdbyname 系统调用吗?

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

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

接收

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

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

除了循环所有已配置的套接字之外的任何想法?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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是本地主机)

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

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

所以fd是513.我并不是说你遵循这条路线,但我认为至少有一种方法可以获得你所要求的。

答案 2 :(得分:1)

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