利用C++兑现ping命令
利用C++实现ping命令
编译的时候出错
警告 1 warning C4018: “<”: 有符号/无符号不匹配 c:\users\administrator\desktop\icmp\icmp\icmp.cpp 61 icmp
错误 2 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib icmp
错误 3 fatal error LNK1120: 1 个无法解析的外部命令 C:\Users\Administrator\Desktop\icmp\Debug\icmp.exe 1 icmp
直接贴代码了
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
#define ICMP_ECHO 8 //回应请求类型的ICMP消息类型
#define ICMP_ECHOREPLY 0 //回应答复型的ICMP消息类型
#define ICMP_MIN 8 // ICMP数据报最小长度
#define DEF_PACKET_SIZE 32 //默认数据报大小
#define DEF_PACKET_NUMBER 4 //发送数据报的个数
#define MAX_PACKET 1024 //最大ICMP数据报大小
char *Ipdest; //目标主机的IP地址
int datasize; //ICMP消息的长度
//接收到的ICMP消息数,每收到一条ICMP消息就加1
static int icmpcount=0;
//IP头(20字节)
struct IPHEAD
{
unsigned int headlength:4; // 4位头长度
unsigned int version:4; // 4位版本
unsigned char tos; // 8位服务类型
unsigned short totallength; // 16位总长
unsigned short ip_id; // 16位标识
unsigned short frag_and_flags; //3个一位标识加分段偏移
unsigned char ttl; //8位存活时间
unsigned char protocal; //8位协议类型
unsigned short ip_checksum; //16位头校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目标IP地址
};
// ICMP 头(12字节)
struct ICMPHEAD
{
unsigned char type; //类型(0,8)
unsigned char code; //代码(0)
unsigned short icmp_checksum; //校验和
unsigned short icmp_id; //标识符
unsigned short seq; //序号
unsigned long timestamp; //时间戳
};
//Fill_icmp_data函数:用于设置ICMP头部,填充ICMP消息
void Fill_icmp_data(char * icmp_data, int datasize)
{
ICMPHEAD *icmphead=NULL;
char *datapart=NULL;
icmphead = (ICMPHEAD*)icmp_data;
icmphead->type = ICMP_ECHO; //ICMP_ECHO=8
icmphead->code = 0; //类型为8,代码为0,表示回应请求
icmphead->icmp_checksum = 0;
icmphead->icmp_id = (unsigned short)GetCurrentProcessId();
datapart = icmp_data + sizeof(ICMPHEAD);//具体内容的首地址指针
//初始化数据包内容部分
for(int i=0;i<(datasize-sizeof(ICMPHEAD));i++,datapart++)
*datapart=0;
}
//DecodeICMPHEAD函数:接受数据时从IP头中获取ICMP消息
void DecodeICMPHEAD(char *recvbuf, int bread, sockaddr_in *from)
{
IPHEAD *iphead=NULL;
ICMPHEAD *icmphead=NULL;
DWORD tick;
unsigned short iphdrlen;
iphead = (IPHEAD *)recvbuf;
//32位字的个数乘以4即字节个数
iphdrlen = (iphead->headlength) * 4 ;
//获取操作系统启动至今所经过的时间(ms)
tick=GetTickCount();
if (bread < (iphdrlen + ICMP_MIN))
{
cout<<"Too few bytes from: "<<inet_ntoa(from->sin_addr);
cout<<endl;
}
icmphead = (ICMPHEAD*)(recvbuf + iphdrlen); //ICMP消息始于IP头之后
//若ICMP消息类型并非查询,则输出相应信息类型
if (icmphead->type != ICMP_ECHOREPLY)
{
cout<<"nonecho type "<<int(icmphead->type)<<" received";
cout<<endl;
}
//确认收到的应答ICMP消息是否是对发送出去的消息的回应
编译的时候出错
警告 1 warning C4018: “<”: 有符号/无符号不匹配 c:\users\administrator\desktop\icmp\icmp\icmp.cpp 61 icmp
错误 2 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib icmp
错误 3 fatal error LNK1120: 1 个无法解析的外部命令 C:\Users\Administrator\Desktop\icmp\Debug\icmp.exe 1 icmp
直接贴代码了
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
#define ICMP_ECHO 8 //回应请求类型的ICMP消息类型
#define ICMP_ECHOREPLY 0 //回应答复型的ICMP消息类型
#define ICMP_MIN 8 // ICMP数据报最小长度
#define DEF_PACKET_SIZE 32 //默认数据报大小
#define DEF_PACKET_NUMBER 4 //发送数据报的个数
#define MAX_PACKET 1024 //最大ICMP数据报大小
char *Ipdest; //目标主机的IP地址
int datasize; //ICMP消息的长度
//接收到的ICMP消息数,每收到一条ICMP消息就加1
static int icmpcount=0;
//IP头(20字节)
struct IPHEAD
{
unsigned int headlength:4; // 4位头长度
unsigned int version:4; // 4位版本
unsigned char tos; // 8位服务类型
unsigned short totallength; // 16位总长
unsigned short ip_id; // 16位标识
unsigned short frag_and_flags; //3个一位标识加分段偏移
unsigned char ttl; //8位存活时间
unsigned char protocal; //8位协议类型
unsigned short ip_checksum; //16位头校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目标IP地址
};
// ICMP 头(12字节)
struct ICMPHEAD
{
unsigned char type; //类型(0,8)
unsigned char code; //代码(0)
unsigned short icmp_checksum; //校验和
unsigned short icmp_id; //标识符
unsigned short seq; //序号
unsigned long timestamp; //时间戳
};
//Fill_icmp_data函数:用于设置ICMP头部,填充ICMP消息
void Fill_icmp_data(char * icmp_data, int datasize)
{
ICMPHEAD *icmphead=NULL;
char *datapart=NULL;
icmphead = (ICMPHEAD*)icmp_data;
icmphead->type = ICMP_ECHO; //ICMP_ECHO=8
icmphead->code = 0; //类型为8,代码为0,表示回应请求
icmphead->icmp_checksum = 0;
icmphead->icmp_id = (unsigned short)GetCurrentProcessId();
datapart = icmp_data + sizeof(ICMPHEAD);//具体内容的首地址指针
//初始化数据包内容部分
for(int i=0;i<(datasize-sizeof(ICMPHEAD));i++,datapart++)
*datapart=0;
}
//DecodeICMPHEAD函数:接受数据时从IP头中获取ICMP消息
void DecodeICMPHEAD(char *recvbuf, int bread, sockaddr_in *from)
{
IPHEAD *iphead=NULL;
ICMPHEAD *icmphead=NULL;
DWORD tick;
unsigned short iphdrlen;
iphead = (IPHEAD *)recvbuf;
//32位字的个数乘以4即字节个数
iphdrlen = (iphead->headlength) * 4 ;
//获取操作系统启动至今所经过的时间(ms)
tick=GetTickCount();
if (bread < (iphdrlen + ICMP_MIN))
{
cout<<"Too few bytes from: "<<inet_ntoa(from->sin_addr);
cout<<endl;
}
icmphead = (ICMPHEAD*)(recvbuf + iphdrlen); //ICMP消息始于IP头之后
//若ICMP消息类型并非查询,则输出相应信息类型
if (icmphead->type != ICMP_ECHOREPLY)
{
cout<<"nonecho type "<<int(icmphead->type)<<" received";
cout<<endl;
}
//确认收到的应答ICMP消息是否是对发送出去的消息的回应