1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包 2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧 3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用啊 理解一下SOCK_RAW的...
原来创建socket使用如下参数s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)。因为linux的raw socket不会把 不会把UDP和TCP的分组传递给任何原始套接口。——见《UNIX网络编程》28.3. 所以为了读到ACK包,我们创建的raw socket需要建立在数据链路层上。 s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)) 这样...
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6)); memset(&sl, 0x00, sizeof(sl)); memset(&ifr, 0x00, sizeof(ifr)); sl.sll_family = AF_PACKET; sl.sll_protocol = htons(ETH_P_IPV6); strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name)); ioctl(fd, SIOCGIFINDEX, &if...
简单来说,使用AF_INET,是面向IP层的原始套接字;使用AF_PACKET,是面向链路层的套接字。 Type就是socket的类型,对于AF_INET协议族而言有流套接字(SOCK_STREAM)、数据包套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)。 /** * enum sock_type - Socket types * @SOCK_STREAM: stream (connection) socket * ...
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); /* newer systems */ 这样将会接收到数据链路层所有协议帧;如果我们只需要IPv4帧,可以这样写: fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); /* new systems */ 或者 fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP)); /...
socket(PF_PACKET, SOCK_RAW|SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)) 发送接收以太网数据帧这种套接字比较强大,可以监听网卡上的所有数据帧 能: 接收发往本地mac的数据帧 能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL) 能: 接收非发往本地mac的数据帧(网卡需要设置为pr...
否则非本机mac或者广播mac会被直接丢弃).按照上面的例子,如果成功的话,会进入ip输入例程.但是在进入ip输入例程之前,系统会检查系统中是否有通过socket(AF_PACKET, SOCK_RAW, ..)创建的套接字.如果有的话并且协议相符,在这个例子中就是需要ETH_P_IP或者ETH_P_ALL类型.系统就给每个这样的socket接收缓冲区发送一...
(1)使用AF_INET协议族中SOCK_PACKET类型的套接字 SOCK_PACKET是Linux支持的一种socket类型,可以通过这种套接字来访问数据链路层,与BPF、DLPI类似。 这种方法要求程序员自己封装ARP包,包括链路层的以太网首部。ARP包的发送和接收与IP层的发送接收类似,不过sockaddr要配置成本地的硬件地址。就像是我们把含以太...
log_txt) { printf("unable to open log.txt\n"); return -1; } printf("starting ... \n"); sock_r=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); if(sock_r<0) { printf("error in socket\n"); return -1; } while(1) { saddr_len=sizeof saddr; buflen=recvfrom(sock_r,buffer...