2

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

这是我创建套接字的方法:

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

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

请问有什么意见吗?

4

2 回答 2

0

我在我的应用程序中也做了同样的事情。

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

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

& 然后收到所有没有任何 ICMP 的流量。

因此,我认为您必须绑定所有端口以避免 ICMP,否则您必须进行一些内核黑客攻击,以停止或删除 linux-kernel 代码中的 ICMP 代码并重新构建

于 2012-11-06T07:22:58.020 回答
0

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

于 2012-10-23T14:18:57.887 回答