原始套接字IP报文嗅探

一个简单的Sniffer程序,可以用来捕获和打印接收到的IP数据包。

实现多IP报文、ARP、TCP和UDP的简单打印,

IP报文0800

ARP报文0806

TCP:6

UDP:17

ICMP:1

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
//#include <arpa/inet.h>
#define BUFFER_MAX 2048

struct my_ethhdr {
    unsigned char h_dest[ETH_ALEN];
    unsigned char h_source[ETH_ALEN];
    unsigned short h_proto;
};

struct my_arphdr {
    unsigned short ar_hrd;
    unsigned short ar_pro;
    unsigned char ar_hln;
    unsigned char ar_pln;
    unsigned short ar_op;
    unsigned char ar_sha[ETH_ALEN];
    unsigned char ar_sip[4];
    unsigned char ar_tha[ETH_ALEN];
    unsigned char ar_tip[4];
};

struct my_iphdr {
    unsigned char ihl:4, version:4;
    unsigned char tos;
    unsigned short tot_len;
    unsigned short id;
    unsigned short frag_off;
    unsigned char ttl;
    unsigned char protocol;
    unsigned short check;
    unsigned int saddr;
    unsigned int daddr;
};

struct my_tcphdr {
    unsigned short source;
    unsigned short dest;
    unsigned int seq;
    unsigned int ack_seq;
    unsigned short res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, res2:2;
    unsigned short window;
    unsigned short check;
    unsigned short urg_ptr;
};

struct my_udphdr {
    unsigned short source;
    unsigned short dest;
    unsigned short len;
    unsigned short check;
};

struct my_icmphdr {
    uint8_t type;
    uint8_t code;
    uint16_t checksum;
    uint32_t data;
};

void uint32_ip_2_str_ip(uint32_t ip,char *str_ip) {
    unsigned char bytes[4];
    bytes[0] = (ip >> 24) & 0xFF;
    bytes[1] = (ip >> 16) & 0xFF;
    bytes[2] = (ip >> 8) & 0xFF;
    bytes[3] = ip & 0xFF;
    sprintf(str_ip,"%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]);
}

int main(int argc, char *argv[])
{

	int sock, n_read, proto;        
	char buffer[BUFFER_MAX];
	struct my_ethhdr *ethhead;
	struct my_iphdr *iphead;
	struct my_tcphdr *tcphead;
	struct my_udphdr *udphead;
	struct my_icmphdr *icmphead;
	char *p;

	if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
	{
		fprintf(stdout, "create socket error/n");
		exit(0);
	}

	while(1) 
	{
		n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);

		if(n_read < 46) 
		{
			fprintf(stdout, "以太网帧数据长度最小为 46 字节\n");
			continue;
		}

		ethhead = (struct my_ethhdr *)buffer;
		int n = 0XFF;
		printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>""[%x]""==>"
				"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
				ethhead->h_dest[0], ethhead->h_dest[1], ethhead->h_dest[2], ethhead->h_dest[3], ethhead->h_dest[4], ethhead->h_dest[5],ntohs(ethhead->h_proto),
				ethhead->h_source[0], ethhead->h_source[1], ethhead->h_source[2], ethhead->h_source[3], ethhead->h_source[4], ethhead->h_source[5]);

		iphead = (struct my_iphdr *)(buffer + 14);  
		char sip[32] = {};
		char dip[32] = {};
 		uint32_ip_2_str_ip(ntohl(iphead->saddr),sip); 
 		uint32_ip_2_str_ip(ntohl(iphead->daddr),dip); 
		printf("IP: %s ==[%d]=> %s\n",sip,iphead->protocol,dip);

	}
} 

使用root权限运行
~/下载/$ sudo ./a.out 
MAC: FF:FF:FF:FF:FF:FF==>[800]==>88:34:c1:b4:a1:23
IP: 192.168.10.155 ==[17]=> 192.168.10.255
MAC: 78:ab:be:32:67:1a==>[800]==>c1:34:b4:23:a1:a6
IP: 56.107.67.93 ==[6]=> 192.168.10.14
MAC: 78:ab:be:32:67:1a==>[800]==>c1:34:b4:23:a1:a6
IP: 56.107.67.93 ==[6]=> 192.168.10.14
MAC: 00:00:00:00:00:00==>[800]==>00:00:00:00:00:00
IP: 127.0.0.1 ==[1]=> 127.0.0.1
MAC: 00:00:00:00:00:00==>[800]==>00:00:00:00:00:00
IP: 127.0.0.1 ==[1]=> 127.0.0.1
^C
~/下载/$ 
更多原始套接字参看下面
https://blog.csdn.net/weixin_43288201/article/details/106266418
相关推荐
yyuuuzz2 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
GlobalInfo2 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
运维行者_4 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
2401_868534784 小时前
陈冲2026年上海纽约大学全英文毕业演讲
服务器·网络
FPGA小迷弟6 小时前
FPGA开发Vivado Block Design/Vitis/SDK/xlinx/开发教程,保姆级别,一看就会!
网络协议·tcp/ip·fpga开发·verilog·fpga
FPGA小迷弟6 小时前
基于FPGA实现智能网卡的概念,什么是智能网卡
网络协议·tcp/ip·fpga开发·verilog·fpga
DYWorker0018 小时前
第1课:基于正点原子RK3568开发板读懂Linux内核
linux·运维·网络
深圳恒讯9 小时前
国外云服务器部署企业官网,怎样确定配置、IP 与后续扩容方案?
运维·服务器·tcp/ip
Lzg_na10 小时前
数据链路层差错控制使用的算法详解
网络
努力努力再努力wz10 小时前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql