Ping命令完整代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include "winsock.h"
#pragma comment(lib,"Ws2_32.lib");
#define SEND_SIZE 32
#define PACKET_SIZE 4096
#define ICMP_ECHO 8
#define ICMP_ECHOREPL Y 0
struct icmp
{
unsigned char icmp_type; // 消息类型
unsigned char icmp_code; // 代码
unsigned short icmp_cksum; // 校验和
unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_seq; // 序列号
unsigned long icmp_data; // 时间戳
};
struct ip
{
unsigned char ip_hl:4; //首部长度
unsigned char ip_v:4; //ip版本号
unsigned char ip_tos; //服务类型
unsigned short ip_len; // 总长度
unsigned short ip_id; //标识
unsigned short ip_off; //标志位
unsigned char ip_ttl; //生存时间
unsigned char ip_p; //协议(TCP或其他)
unsigned short ip_sum; //ip首部校验和
unsigned long ip_src; //源ip地址
unsigned long ip_dst; //目的ip地址
};
unsigned char sendpacket[PACKET_SIZE];
unsigned char recvpacket[PACKET_SIZE];
struct sockaddr_in dest_addr;
struct sockaddr_in from_addr;
int sockfd;
int pid;
int timeout;
unsigned short cal_chksum(unsigned short *addr,int len);
int pack(int pack_no);
int unpack(unsigned char *buf,int len);
void send_packet(void);
void recv_packet(void);
void main()
{
printf("———————————————————————————————\n"); printf(" 查看帮助请按 1 \n\n"); printf(" 直接ping目的主机请按 2 \n\n"); printf(" 一直ping目的主机请按 3 \n\n"); printf(" 指定向目的主机发送报文数目请按 4 \n\n"); printf(" 将地址解析为计算机名输出请按 5 \n\n"); printf(" 设置超时时间 6 \n\n");
printf("——————————————————————————————\n\n"); int select;
printf("请选择:");
scanf("%d",&select);
if(select==1)
{
printf("参数\n");
printf(" 1 查看帮助\n");
printf(" 2 直接ping目的主机\n");
printf(" 3 一直ping目的主机\n");
printf(" 4 指定向目的主机发送报文数目\n");
printf(" 5 将地址解析为计算机名输出\n");
printf(" 6 设置超时时间\n");}
else{
int argc;char *argv[2];
char str[15];
printf("请输入所要ping的主机ip地址或域名,按回车键结束:"); scanf("%s",&str); //输入目的ip
printf("\n");
argc = 2;
argv[0]= "-t";
argv[1]=str;
struct hostent *host;
struct protoent *protocol;
WSADATA wsaData; //WSADA TA数据结构
timeout=1000; //设置超时
int SEND_COUNT; //设置发送的报文数
if(select==6)
{
printf("请输入数据包超时时间,按回车键结束:");
scanf("%d",&timeout);
printf("\n");}
if(select==4)
{
printf("请输入发往目的主机的报文数,按回车键结束:"); scanf("%d",&SEND_COUNT);
printf("\n");}
int i;
char *par_host;
par_host=argv[argc-1];
switch(argc)
{
case 2: break;
case 3: if(strcmp(argv[1],"-t")==0)
{
SEND_COUNT=10000;
break;
}
default: