首先,网卡对该数据帧进行硬过滤(根据网卡的模式不同会有不同的动作,如果设置了promisc混杂模式的话,则不做任何过滤直接交给下一层输入例程,否则非本机mac或者广播mac会被直接丢弃).按照上面的例子,如果成功的话,会进入ip输入例程.但是在进入ip输入例程之前,系统会检查系统中是否有通过socket(AF_PACKET, SOCK_RAW, ...
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的原理...
内核会根据协议族(如AF_INET)找到对应的协议族处理结构体(pf_inet对于IPv4)。 然后,根据socket类型(如SOCK_STREAM)和协议编号(通常是0,表示自动选择),内核会选择具体的协议实现(如TCP)。 创建套接字实例: 内核会为新的socket分配一个套接字实例(struct socket)。 这个实例中包含了操作这个socket所需要的所有方法...
AF_UNIX/PF_UNIX/AF_LOCAL/PF_LOCAL:Unix进程通信协议(本地通信); AF_INET/PF_INET:IPv4网络协议;(不同主机通信) AF_PACKET/PF_PACKET:初级封包接口;(自定义数据包) • type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。 1).流套接字(SOCK_...
socket(AF_INET, SOCK_RAW, IPPROTO_UDP );//第三个参数可以是UDP,TCP或者ICMP 1. (2)接收 recvfrom(sd, buffer, sizeof(buffer), 0,(struct sockaddr *)&client_addr, &addrlen));// 1. 后两个参数可以为null 接受的报文是从IP数据报的第一个字节开始的。
对于原始套接字,domain(family)套接字族可以是AF_INET、PF_INET、AF_PACKET和PF_PACKET;套接字类型是SOCK_RAW;至于协议,可以查阅if_ether.h头文件。 因此,可以看到使用各种参数的组合来创建原始套接字。这也是学习raw socket的时候很容易混淆的一点。
AF_INET和PF_INET效果相同。 l套接字类型: SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等 常见的2个类型的套接字: 流套接字和数据包套接字 流套接字(在某些方面类似域标准的输入/输出流)提供的是一个有序,可靠,双向字节流的连接。 提供面向连接的服务。
int main() { sock_raw=socket(AF_PACKET,SOCK_RAW,IPPROTO_RAW); if(sock_raw == -1) printf("error in socket"); // increase in case of large data.Here data is --> AA BB CC DD EE sendbuff=(unsigned char*)malloc(64); memset(sendbuff,0,64); get_eth_index(); // interface num...
type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。 protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这...