利用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消息是否是对发送出去的消息的回应