PF_PACKET套接字和“端口不可达”ICMP消息

时间:2012-10-23 14:08:43

标签: linux-kernel raw-sockets

我的应用程序需要从多个目标端口接收UDP数据包(这是一个真正的应用程序而不是嗅探器)。因此,我选择使用PF_PACKET套接字并在应用程序级别进行端口过滤。

以下是我创建套接字的方法:

int g_rawSocket = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

我正确接收UDP数据包。但是,运行应用程序的内核是向正在向我的应用程序发送数据包的远程设备发送“目标无法访问”类型的ICMP数据包和“无法访问端口”代码。我想这是因为我没有将端口号绑定到套接字。但是,我想知道使用与PF_PACKET套接字绑定是否合适,特别是因为我需要将多个端口绑定到它,我想这是不可能的。

有任何意见吗?

2 个答案:

答案 0 :(得分:0)

不,它不能绑定到特定端口,因为它的工作级别低于传输(UDP / TCP)层。但是,您可以使用常规UDP(AF_INET / SOCK_DGRAM)套接字和select打开并监听所有套接字,据我所知,您可以绑定并收听任意数量的套接字,只要您愿意你不会超过你的过程的开放文件描述符的限制。

答案 1 :(得分:0)

我在申请中也做了同样的事情。

在我的情况下,我创建了许多我需要的套接字&将它们与特定端口绑定。但我没有听任何插座。所以我创建了一个原始套接字

int sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);

&安培;然后收到所有流量,没有任何ICMP。

所以我认为你必须绑定所有端口以避免ICMP你要么必须某些内核黑客攻击,因为在Linux内核代码中删除或删除ICMP代码&再次建立