但是这个描述并不完全,于是我参考:信息安全课程9:raw socket编程 - 知乎 另外还了解到原始套接字在socket的创建上有不同的组合,例如: AF_INET+SOCK_RAW最多只能允许用户层与IP层直接通信,而AF_PACKET+SOCK_RAW就可以允许用户层与数据链路层直接通信了(这一点也是Linux_Unix系统编程手册说得不准确的地方) 另外,...
s = socket (PF_PACKET, SOCK_RAW, type); if (s < 0) { return (s); } memset ((void*)&ifr, 0, sizeof (ifr)); snprintf (ifr.ifr_name, sizeof (ifr.ifr_name), "eth0"); retval = ioctl (s, SIOCGIFINDEX, &ifr); if (retval < 0) { close (s); return (retval); } memse...
使用socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)创建的套接字到底为何于众不同,今日追踪了一下。使用Linux 3.2.5版内核 net/socket.c 点击(此处)折叠或打开 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { ... retval = sock_create(family, type, protocol, &sock); ... } 点击...
1.打开af_packet socket:用户程序通过调用socket()函数并指定地址家族(AF_PACKET)、套接字类型(SOCK_RAW)和端口参数等来打开一个af_packet socket。 2.绑定网卡:用户程序可以调用bind()函数将打开的socket与指定的网卡进行绑定,这样就可以监听和接收该网卡上的数据包。 3.读取数据包:用户程序可以使用read()函数从...
SOCK_RAW---自己构造以太头 3)协议类型 这里协议类型等同于前面提到的以太网类型(转换成网络字节序),用于过滤接收的报文 在这个列子中socket是发送arp报文,protocol用hton(ETH_P_ARP),type使用SOCK_DGRAM,这样就不需要自己构造以太头了。 点击(此处)折叠或打开 int ...
intfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); 参数AF_PACKET 定义了socket的类型。 SOCK_RAW是捕获带14字节的链路层头的数据包,如果不带则传入SOCK_DGRAM. 第三个参数是代表协议,来自if_ether.h为网络字节序,查看如下:cat /usr/include/linux/if_ether.h ...
原文出处:http://blog.chinaunix.net/uid-22362479-id-3220107.htmlhttp://blog.chinaunix.net/uid-22362479-id-3220136.html 使用socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)创建的套接字到底为何于众不同,今日追踪了一下。使用 Linux protocol family
Previously, despite what the commit said, we were using a raw IP socket that was not an AF_PACKET socket, and thus was subject to the host firewall rules. Switch to using a real AF_PACKET socket to...
链路层原始套接字调用socket()函数创建。第一个参数指定地址簇类型为AF_PACKET,第二个参数套接字类型为SOCK_RAW或SOCK_DGRAM,当类型指定为SOCK_RAW时,套接字接收和发送的数据都是从MAC首部开始的。在发送时需要由调用者从MAC首部开始构造和封装报文数据。
1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop...