今天写的ping 255个主机的程序

博客记录了编程调试中的问题与处理方法。在多进程参数传递时,需注意 new 和 delete 配对,应在 threadcreate 前 new、threadfunc 里 delete;还提到做专门消息处理函数可简化模块、方便调试;CString 类的 fomate 成员很有用;最后程序异常,改用文件类处理数据。

1.多进程的参数传递上,new 和delete的配对问题上debug了很长的时间,应该在threadcreate前面new 在threadfunc里面delete
2.应该专门做个消息处理函数用来显示,可以简化程序的模块,方便调试,
3,CString类的fomate成员相当有用,又用到了,还有在调试的时候,又遇到了很多问题,以后要早发先问题,早调试,
4.最后 程序工作的很不正常,也不知道是什么原因,我改用文件类来把数据写到文件中去来处理,v
电脑Ping程序可从其原理出发,结合不同操作系统的特点进行。Ping程序基本原理是发送ICMP响应请求给某一主机,该主机返回一个ICMP响应应答,程序收到应答则显示结果。下面分不同情况介绍编方法: ### 基本思路 为完成Ping程序,首先要创建协议为ICMP的原始套接字以接收/发送ICMP包,接着构造ICMP包,通过原始套接字发送给对方主机 [^3]。 ### 不同操作系统实现 #### 类Unix系统(如Linux和macOS) 在类Unix系统中,可使用C语言结合系统调用编Ping程序。以下是一个简单示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <unistd.h> #include <sys/time.h> #define PACKET_SIZE 4096 #define MAX_WAIT_TIME 5 #define MAX_NO_PACKETS 3 char sendpacket[PACKET_SIZE]; char recvpacket[PACKET_SIZE]; // 计算校验和 unsigned short cal_chksum(unsigned short *addr, int len) { int nleft = len; int sum = 0; unsigned short *w = addr; unsigned short answer = 0; while (nleft > 1) { sum += *w++; nleft -= 2; } if (nleft == 1) { *(unsigned char *)(&answer) = *(unsigned char *)w; sum += answer; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return answer; } // 构造ICMP包 int pack(int pack_no) { int i, packsize; struct icmp *icmp; icmp = (struct icmp *)sendpacket; icmp->icmp_type = ICMP_ECHO; icmp->icmp_code = 0; icmp->icmp_cksum = 0; icmp->icmp_seq = pack_no; icmp->icmp_id = getpid(); packsize = 8; icmp->icmp_cksum = cal_chksum((unsigned short *)icmp, packsize); return packsize; } // 发送ICMP包 void send_packet(int sockfd, struct sockaddr_in *dest_addr) { int packetsize; static int pack_no = 0; packetsize = pack(pack_no++); if (sendto(sockfd, sendpacket, packetsize, 0, (struct sockaddr *)dest_addr, sizeof(*dest_addr)) < 0) { perror("sendto error"); } } // 接收ICMP包 void recv_packet(int sockfd) { int n; struct sockaddr_in from; socklen_t fromlen = sizeof(from); while (1) { n = recvfrom(sockfd, recvpacket, sizeof(recvpacket), 0, (struct sockaddr *)&from, &fromlen); if (n < 0) { perror("recvfrom error"); continue; } // 解析ICMP包并处理结果 // 此处省略解析代码 break; } } int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in dest_addr; if (argc != 2) { printf("Usage: %s <ip address>\n", argv[0]); return 1; } bzero(&dest_addr, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; if (inet_pton(AF_INET, argv[1], &dest_addr.sin_addr) <= 0) { perror("inet_pton error"); return 1; } sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockfd < 0) { perror("socket error"); return 1; } for (int i = 0; i < MAX_NO_PACKETS; i++) { send_packet(sockfd, &dest_addr); recv_packet(sockfd); sleep(1); } close(sockfd); return 0; } ``` 此程序通过创建原始套接字,构造ICMP包并发送,然后接收响应,实现了简单的Ping功能。 #### Windows系统 在Windows系统中,可以使用Windows API来实现Ping功能,示例代码如下: ```cpp #include <iostream> #include <windows.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") #define PACKET_SIZE 32 int main() { char ipAddress[] = "127.0.0.1"; HANDLE hIcmpFile; unsigned long ipaddr = INADDR_NONE; DWORD dwRetVal = 0; char SendData[PACKET_SIZE] = "Data Buffer"; LPVOID ReplyBuffer = NULL; DWORD ReplySize = 0; ipaddr = inet_addr(ipAddress); if (ipaddr == INADDR_NONE) { std::cerr << "Invalid IP address." << std::endl; return 1; } hIcmpFile = IcmpCreateFile(); if (hIcmpFile == INVALID_HANDLE_VALUE) { std::cerr << "IcmpCreateFile failed." << std::endl; return 1; } ReplySize = sizeof(ICMP_ECHO_REPLY) + PACKET_SIZE; ReplyBuffer = (VOID *)malloc(ReplySize); if (ReplyBuffer == NULL) { std::cerr << "Memory allocation failed." << std::endl; IcmpCloseHandle(hIcmpFile); return 1; } dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 1000); if (dwRetVal > 0) { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; std::cout << "Received " << dwRetVal << " ICMP Echo Replies." << std::endl; std::cout << "RTT: " << pEchoReply->RoundTripTime << " ms" << std::endl; } else { std::cerr << "No ICMP Echo Replies received." << std::endl; } free(ReplyBuffer); IcmpCloseHandle(hIcmpFile); return 0; } ``` 该程序使用Windows的IcmpCreateFile和IcmpSendEcho等API实现Ping功能。 ### 总结 编Ping程序主要涉及创建套接字、构造ICMP包、发送和接收ICMP包等步骤,不同操作系统实现方式有所不同,但基本原理一致 [^2][^3][^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值