但是这个描述并不完全,于是我参考:信息安全课程9:raw socket编程 - 知乎 另外还了解到原始套接字在socket的创建上有不同的组合,例如: AF_INET+SOCK_RAW最多只能允许用户层与IP层直接通信,而AF_PACKET+SOCK_RAW就可以允许用户层与数据链路层直接通信了(这一点也是Linux_Unix系统编程手册说得不准确的地方) 另外,...
参数AF_PACKET 定义了socket的类型。 SOCK_RAW是捕获带14字节的链路层头的数据包,如果不带则传入SOCK_DGRAM. 第三个参数是代表协议,来自if_ether.h为网络字节序,查看如下:cat /usr/include/linux/if_ether.hETH_P_ALL代表所有协议的都捕获,如果只抓IP协议的流量,通过ETH_P_IP来指定。 如果协议设置为0,则不...
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...
5 intsockfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); if(sockfd<0) { perror("Socket creation failed"); return-1; } 1绑定网络设备: 99 1 2 3 4 5 6 7 8 9 10 11 structsockaddr_llsll; memset(&sll,0,sizeof(sll)); sll.sll_family=AF_PACKET; sll.sll_protocol=htons(ETH...
使用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()函数从...
创建套接字:应用程序通过调用 socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 创建一个 af_packet 套接字。这个调用会设置套接字的协议族为 AF_PACKET,类型为 SOCK_RAW,以捕获所有类型的以太网协议数据包。 绑定网卡:通过调用 bind 函数,应用程序可以将套接字绑定到特定的网络接口,从而只接收该接口上的数...
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 ...
SOCK_RAW---自己构造以太头 3)协议类型 这里协议类型等同于前面提到的以太网类型(转换成网络字节序),用于过滤接收的报文 在这个列子中socket是发送arp报文,protocol用hton(ETH_P_ARP),type使用SOCK_DGRAM,这样就不需要自己构造以太头了。 点击(此处)折叠或打开 int ...
链路层原始套接字调用socket()函数创建。第一个参数指定地址簇类型为AF_PACKET,第二个参数套接字类型为SOCK_RAW或SOCK_DGRAM,当类型指定为SOCK_RAW时,套接字接收和发送的数据都是从MAC首部开始的。在发送时需要由调用者从MAC首部开始构造和封装报文数据。