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
通过非特权套接字在应用程序级别获取ICMP消息内容_C_Sockets_Networking_Network Programming_Icmp - Fatal编程技术网

通过非特权套接字在应用程序级别获取ICMP消息内容

通过非特权套接字在应用程序级别获取ICMP消息内容,c,sockets,networking,network-programming,icmp,C,Sockets,Networking,Network Programming,Icmp,是否可以通过Linux系统上的非特权套接字获取接收到的ICMP消息的内容 我很想知道是否可以使用UDP DGRAM套接字、TCP流套接字和/或ICMP DGRAM套接字来实现 TCP套接字 我知道AF_INET、SOCK_STREAM、IPPROTO_TCP sockets可以通过返回值(如enetureach、ETIMEDOUT等)获得连接结果的反馈。我想要的是实际的整个ICMP消息整个数据包通过任何方式创建另一个套接字。。。除了sudo和setuid,没有原始套接字 UDP套接字 我知道您可

是否可以通过Linux系统上的非特权套接字获取接收到的ICMP消息的内容

我很想知道是否可以使用UDP DGRAM套接字、TCP流套接字和/或ICMP DGRAM套接字来实现

TCP套接字 我知道AF_INET、SOCK_STREAM、IPPROTO_TCP sockets可以通过返回值(如enetureach、ETIMEDOUT等)获得连接结果的反馈。我想要的是实际的整个ICMP消息整个数据包通过任何方式创建另一个套接字。。。除了sudo和setuid,没有原始套接字

UDP套接字 我知道您可以将IP_RECVERR IP_协议级别选项设置为AF_INET、SOCK_DGRAM、IPPROTO_UDP sockets,但不能设置为STREAM sockets。此选项允许调用设置了MSG_ERRQUEUE标志的recvmsg,以接收包含ICMP错误的sock_extended_err结构。它是默认工作还是必须指定要传递的ICMP消息,即:通过ICMP_筛选器套接字选项

ICMP套接字 我还知道,自2010年以来,Linux系统允许AF_INET、SOCK_DGRAM、IPPROTO_ICMP套接字发送一些ICMP消息,用于ping目的。我不关心发送ICMP,也不关心接收一些我不知道的类型/代码。但它看起来在默认情况下没有启用,需要根权限才能激活,这是被禁止的。是否可以使用这些来接收ICMP消息,以及哪些消息

附加信息
我明确地说,我是针对Linux内核>=2.6.x和IPv4提出这一要求的。我要检索的ICMP消息最重要的是ttl已过期,如果可能,dest/port/host/network未读。我不能以root或setuid root身份运行程序,因此禁止使用原始套接字。我不需要检索封装ICMP消息的IP层。

为什么不检查freebsd? 它支持TCP、UDP和ICMP

链接:

FreeBSD FreeBSD采用了另一种方法,因为它们是通过使用libpcap或BPFAPI等库在数据链路层直接读取的。 FreeBSD传递到原始套接字: 每个IP数据报都有一个未在中注册的协议字段 内核 b内核完成处理后的所有IGMP数据包 c除回显请求、时间戳请求和地址外的所有ICMP数据包
内核完成处理后屏蔽请求

为什么不检查freebsd? 它支持TCP、UDP和ICMP

链接:

FreeBSD FreeBSD采用了另一种方法,因为它们是通过使用libpcap或BPFAPI等库在数据链路层直接读取的。 FreeBSD传递到原始套接字: 每个IP数据报都有一个未在中注册的协议字段 内核 b内核完成处理后的所有IGMP数据包 c除回显请求、时间戳请求和地址外的所有ICMP数据包
内核完成处理后的掩码请求

这不是100%重复,但非常接近。它的级别低于UDP和TCP,因此不能将UDP或TCP用于ICMP。@JoachimPileborg它处于不同的抽象级别,但这并不意味着信息不能在2个UDP堆栈之间传输到应用程序。@user590028谢谢,这应该可以用于第2点。这不是100%重复,但非常接近。比UDP和TCP的级别都低,因此不,您不能将UDP或TCP用于ICMP。@JoachimPileborg它处于不同的抽象级别,但这并不意味着信息不能在2个UDP堆栈之间传输到应用程序。@user590028谢谢,对于第2点,这应该可以做到。OP特别要求在不使用原始套接字的情况下执行此操作,因为原始套接字需要在FreeBSD以及大多数其他操作系统上使用特权。我不能使用原始套接字或数据链路套接字,因为它们需要根权限。此外,原始套接字不是FreeBSD特有的。它们是BSD套接字,演变为POSIX套接字,用于Linux>2.6中,MAC OS X和BSD系统。OP特别要求在不使用原始套接字的情况下执行此操作,因为原始套接字需要在FreeBSD以及大多数其他操作系统上使用特权。我不能使用原始套接字或数据链路套接字,因为它们需要根权限。此外,原始套接字不特定于FreeBSD。它们是BSD套接字,演变为POSIX套接字,用于Linux>2.6、MAC OS X和BSD系统。