/*拆解到IP报文*/ #include #include #include #include #include #include int main(int argc, char const *argv[]) { // 创建原始套接字 int sock_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock_fd < 0) { perror("raw socket"); return -1; } printf("原始套接字创建成功\n"); // 多次接收数据 while (1) { // 接链路层的数据报文(MAC报文) unsigned char buf[1518] = ""; // 记得使用无符号类型 int len = recvfrom(sock_fd, buf, sizeof(buf), 0, NULL, NULL); if (len < 18) { perror("recvfrom"); continue; } // 拆解 MAC 数据报文 unsigned char dst_mac[18] = ""; // 目的MAC地址 unsigned char src_mac[18] = ""; // 源MAC地址 unsigned short mac_type = ntohs(*((unsigned short *)(buf + 12))); // sprintf(src_mac, "%02x:%02x:%02x:%02x:%02x:%02x", buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]); // sprintf(dst_mac, "%02x:%02x:%02x:%02x:%02x:%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); sprintf(src_mac, "%02x:%02x:%02x:%02x:%02x:%02x", buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]); sprintf(dst_mac, "%02x:%02x:%02x:%02x:%02x:%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); // if (strncmp(src_mac, "00:00:00", 8) != 0) printf("dst_mac %s -> src_mac %s type(%#x)\n", dst_mac, src_mac, mac_type); sleep(1); switch (mac_type) { case 0x0800: printf("-----ip 数据包-----\n"); break; case 0x0806: printf("-----ARP 数据包-----\n"); break; case 0x8035: printf("-----RARP 数据包-----\n"); break; } } close(sock_fd); return 0; }