#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
struct icmp_packet {
struct icmphdr icmp_hdr;
char payload[64];
};
u_int16_t in_cksum(u_int16_t *packet,int packlen) {
unsigned long sum = 0;
while(packlen > 1) {
sum = sum + *(packet++);
packlen = packlen - 2;
}
if(packlen > 0) {
sum = sum + *(unsigned char *)packet;
}
while(sum >> 16) {
sum = (sum & 0xffff) + (sum >> 16);
}
return (u_int16_t)~sum;
}
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in dest_addr;
struct hostent *host;
char buffer[1024];
struct icmp_packet i_packet;
struct icmp_packet *recvp;
int dest_len = sizeof(dest_addr);
int i, cc;
if (argc != 2) {
fprintf(stderr, "Usage: %s [The hostname you want to test]\n", argv[0]);
exit(1);
}
// 创建原始套接字
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
// 检查是否创建成功
if (sockfd < 0) {
perror("socket");
exit(1);
}
// 解析目标主机名
bzero(&dest_addr, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = 0;
dest_addr.sin_addr.s_addr = inet_addr(argv[1]);
//if ((host = gethostbyname(argv[1])) == NULL) {
// fprintf(stderr, "Unknown host: %s\n", argv[1]);
// exit(1);
//}
//memcpy((char *)&dest_addr.sin_addr, (char *)host->h_addr_list, host->h_length);
// 填充ICMP头部和数据
memset(&i_packet,0,sizeof(i_packet));
i_packet.icmp_hdr.type = ICMP_ECHO; // 回显请求类型
i_packet.icmp_hdr.code = 0;
i_packet.icmp_hdr.checksum = 0;
i_packet.icmp_hdr.un.echo.sequence = 1;
i_packet.icmp_hdr.un.echo.id = getpid();
for (i = 0; i < 256; i++) {
buffer[i] = (char)i;
}
// 计算ICMP校验和
i_packet.icmp_hdr.checksum = in_cksum((unsigned short *)&i_packet, sizeof(struct icmp_packet));
// 发送ICMP请求
if (sendto(sockfd, buffer, sizeof(struct icmp_packet) + 256, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) < 0) {
perror("sendto");
exit(1);
}
// 接收ICMP回复
cc = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&dest_addr, &dest_len);
if (cc < 0) {
perror("recvfrom");
exit(1);
} else {
printf("Host is alive.");
}
//recvp = (struct icmp_packet *)&buffer;
// 检查回复的ICMP数据
//if (recvp->icmp_hdr.type == ICMP_ECHOREPLY) {
//printf("Received ICMP Echo Reply from %s\n", inet_ntoa(dest_addr.sin_addr));
//} else {
//printf("Received ICMP Type: %d\n", recvp->icmp_hdr.type);
//}
close(sockfd);
return 0;
}
请问我这段实现icmp的代码是不是哪里少了什么,或者出错了,执行了以后什么都不回应,就是一直卡着。