Linux c原始套接字实现icmp,每秒发送一次icmp包
时间: 2023-11-22 22:53:26 浏览: 48
实现 Linux c 原始套接字发送 ICMP 包可以通过以下步骤:
1. 创建原始套接字
```
int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
```
2. 设置 IP 头部信息
```
struct iphdr ip_header;
ip_header.version = 4; // IPv4
ip_header.ihl = 5; // IP 头部长度
ip_header.tos = 0; // 服务类型
ip_header.tot_len = sizeof(struct iphdr) + sizeof(struct icmphdr); // IP 包总长度
ip_header.id = htons(0); // 身份标识符
ip_header.frag_off = 0; // 分段偏移量
ip_header.ttl = 64; // 存活时间
ip_header.protocol = IPPROTO_ICMP; // 协议类型
ip_header.check = 0; // 校验和
ip_header.saddr = inet_addr("192.168.0.1"); // 源 IP 地址
ip_header.daddr = inet_addr("192.168.0.2"); // 目标 IP 地址
```
3. 设置 ICMP 头部信息
```
struct icmphdr icmp_header;
icmp_header.type = ICMP_ECHO; // ICMP 类型为回显请求
icmp_header.code = 0; // 代码为 0
icmp_header.checksum = 0; // 校验和
icmp_header.un.echo.id = getpid(); // 标识符为当前进程 ID
icmp_header.un.echo.sequence = 0; // 序列号为 0
```
4. 构造并发送数据包
```
char buffer[sizeof(struct iphdr) + sizeof(struct icmphdr)];
memcpy(buffer, &ip_header, sizeof(struct iphdr));
memcpy(buffer + sizeof(struct iphdr), &icmp_header, sizeof(struct icmphdr));
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("192.168.0.2");
while (1) {
sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
sleep(1); // 每秒发送一次 ICMP 包
}
```
需要注意的是,发送 ICMP 包需要以 root 权限运行程序。