s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
答案 0 :(得分:1)
这是使用的协议。来自documentation -
socket.socket([family [,type [,proto]]])
使用给定的地址系列,套接字类型和协议号创建一个新套接字。地址族应为AF_INET(默认值),AF_INET6或AF_UNIX。套接字类型应该是SOCK_STREAM(默认值),SOCK_DGRAM或者其他SOCK_常量之一。协议号通常为零,在这种情况下可以省略。
如果省略protocol,则默认为0,这将导致根据family
(第一个参数)采用协议。
对于linux,您可以在/etc/protocols
中找到协议编号列表。我相信当您将协议作为0x0003
时,它正在使用GGP(网关 - 网关协议)。
答案 1 :(得分:1)
最后一个参数是protocol
,通常保留为0,记录为here。
IANA列表Assigned Internet Protocol Numbers,'0x0003`定义为:
3 GGP Gateway-to-Gateway
ntohs()
函数用于根据需要对数字进行端点交换(基于您运行的体系结构)。对于您的示例,这可能是0x0300
或768
,这对我没有意义。也许其他人知道我不知道的特殊用例。
答案 2 :(得分:1)
在Linux中,socket.ntohs(0x0003)
告诉您捕获一切,包括以太网帧。
仅捕获TCP,UDP或ICMP,而不是socket.ntohs(0x0003)
,您将分别编写socket.IPPROTO_TCP
,socket.IPPROTO_UDP
和socket.IPPROTO_ICMP
。
在Windows中,套接字只能捕获IP及更高版本,而不能捕获以太网。为此,您可以在Windows中使用pypcap
库。
答案 3 :(得分:0)
如果你检查linux/if_ether_h,你会发现
#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */
所以0x0003意味着捕获所有数据包
答案 4 :(得分:0)
从python官方套接字doc
socket.ntohs(0x0003)
捕获来自网络接口的所有发送和接收流量。