他们是一种方式(除了在所有开放的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
以转发消息。
除了循环所有已配置的套接字之外的任何想法?
答案 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套接字)