icmp ping实现C语言
时间: 2025-02-03 18:41:44 浏览: 32
### 实现ICMP Ping功能
为了在 Linux 中使用 C 语言实现 ICMP Ping 功能,程序需要创建原始套接字并发送 ICMP 请求消息给目标主机。下面是一个简化版本的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUFFER_SIZE 60
void create_icmp_packet(char *buffer, int id) {
struct icmp {
unsigned char type;
unsigned char code;
unsigned short checksum;
unsigned short identifier;
unsigned short sequence_number;
} __attribute__((packed)) packet;
packet.type = 8; /* Echo request */
packet.code = 0;
packet.checksum = 0;
packet.identifier = htons(id);
packet.sequence_number = htons(1);
memcpy(buffer, &packet, sizeof(packet));
}
unsigned short calculate_checksum(unsigned short *addr, int len) {
int nleft = len;
int sum = 0;
unsigned short answer = 0;
unsigned short *w = addr;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(u_char *) (&answer) = *(u_char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;
}
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <IP address> <identifier>\n", argv[0]);
exit(EXIT_FAILURE);
}
const char *target_ip = argv[1];
int id = atoi(argv[2]);
int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE];
memset(buffer, '\0', BUFFER_SIZE);
create_icmp_packet(buffer, id);
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
inet_pton(AF_INET, target_ip, &(dest_addr.sin_addr));
sendto(sockfd, buffer, sizeof(struct icmp), 0,
(struct sockaddr *)&dest_addr, sizeof(dest_addr));
close(sockfd);
printf("Ping sent to IP: %s with ID: %d\n", target_ip, id);
}
```
上述代码展示了如何构建一个简单的 ICMP echo 请求报文,并通过原始套接字将其发送到指定的目标地址[^1]。
阅读全文
相关推荐


















