Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从IP地址和端口获取套接字FD_Linux_Sockets_Udp - Fatal编程技术网

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容器(例如映射)作为密钥。