Linux 从IP地址和端口获取套接字FD
它们是否是获得给定Linux 从IP地址和端口获取套接字FD,linux,sockets,udp,Linux,Sockets,Udp,它们是否是获得给定IP地址和端口的FD的一种方法(在所有打开的FD上循环除外)? 我有一堆打开的UDP套接字,每个套接字绑定到一个IP地址和端口。在某些情况下,应用程序充当转发应用程序。它们是系统调用吗 具体来说,我的UDP应用程序(C)位于节点A和B之间 1) A使用C接收的源端口2000,目标端口3000向C发送消息 2) 然后C必须使用端口2000将其转发到节点B的端口3000 在步骤1,绑定到端口3000的打开套接字接收消息。但是,此时,我需要获取端口2000的套接字绑定的FD,以转发消
IP地址和端口的FD的一种方法(在所有打开的FD上循环除外)?
我有一堆打开的UDP套接字,每个套接字绑定到一个IP地址和端口。在某些情况下,应用程序充当转发应用程序。它们是系统调用吗
具体来说,我的UDP应用程序(C)位于节点A和B之间
1) A使用C接收的源端口2000
,目标端口3000
向C发送消息
2) 然后C必须使用端口2000将其转发到节点B的端口3000
在步骤1,绑定到端口3000
的打开套接字接收消息。但是,此时,我需要获取端口2000的套接字绑定的FD
,以转发消息
除了在所有配置的套接字上循环之外,还有其他想法吗 您可以保留address=>socket映射的散列
我通常使用由地址和套接字FD组成的struct,它表示我与之通信的主机。然后我有一个查找函数,它根据地址查找结构。您可以保留地址=>套接字映射的散列
我通常使用由地址和套接字FD组成的struct,它表示我与之通信的主机。然后我有一个查找函数,它可以按地址查找结构。不,没有这样的调用,但是使用UDP,您不需要为每个目标主机/端口使用单独的套接字-这就是它的用途(除非您实际连接(2)
您的UDP套接字)。没有这样的调用,但是,使用UDP,您不需要为每个目标主机/端口使用单独的套接字-这就是它的用途(除非您实际上connect(2)
您的UDP套接字)。您可以查看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//fd/
我们看到:
...
lrwx------ 1 bind bind 64 2010-07-20 06:26 513 -> socket:[11075]
...
所以fd是513。我不是建议您遵循这条路线,但我认为这至少是获得您所要求的内容的一种方法。您可以查看
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//fd/
我们看到:
...
lrwx------ 1 bind bind 64 2010-07-20 06:26 513 -> socket:[11075]
...
所以fd是513。我不是建议您遵循这条路线,但我认为这至少是获得您所要求的内容的一种方法。我更感兴趣的是更改我发送的每个数据报的源IP/端口。嗯,如果您发送,源IP/端口将自动更改,因为它是从不同的主机/端口发送的。我这里说的是你的应用程序C——只需使用一个出站套接字,并将目标IP/端口更改为你需要的任何内容。我希望源IP/端口更改为我想要的,而不是内核填充的内容。如果我从srcPort 2000接收消息到5000上的侦听端口,我需要将此消息从srcPort 2000转发到对等的dest端口5000。据我所知,您可以将(2)UDP套接字重新绑定到不同的端口。那会给你你想要的。@Aditya:那我建议你再问一个问题!但简单地说,您可能正在寻找一个原始套接字,您可以使用
socket(PF_INET,SOCK_raw,IPPROTO_ip)
以您认为合适的方式(包括您想要的ip+UDP头)发送原始ip数据包。我更感兴趣的是更改我发送的每个数据报的源ip/端口,如果您将其发送出去,源IP/端口将自动更改,因为它是从不同的主机/端口发送的。我这里说的是你的应用程序C——只需使用一个出站套接字,并将目标IP/端口更改为你需要的任何内容。我希望源IP/端口更改为我想要的,而不是内核填充的内容。如果我从srcPort 2000接收消息到5000上的侦听端口,我需要将此消息从srcPort 2000转发到对等的dest端口5000。据我所知,您可以将(2)UDP套接字重新绑定到不同的端口。那会给你你想要的。@Aditya:那我建议你再问一个问题!但简单地说,您可能正在寻找一个原始套接字,您可以使用socket(PF_INET,SOCK_raw,IPPROTO_ip)
使用它以您认为合适的方式发送原始ip数据包(包括您想要的ip+UDP头)。这是正确的答案-“在创建套接字时跟踪它”。是的-如果您的应用程序想要这样做,它需要跟踪它。您可以使用带有地址/端口对的STL容器(例如map)作为密钥。这是正确的答案-“在创建套接字时跟踪它”。是的-如果您的应用程序想要这样做,它需要跟踪它。您可以使用带有地址/端口对的STL容器(例如映射)作为密钥。