以前學習ICMP協議時候寫的一個模仿windows自帶的ping程序,今天翻代碼看到了,貼上來供大家拍磚。
2010-12-15日更新補充:這段代碼獲取的是第一個活動網卡IP來發送ICMP報文,如果有多個網卡,例如插網線和wifi網卡同時開,那么就由插網線的網卡發送,如何讓wifi網卡發送呢?很簡單,加一個-p [bindLocalIP]參數就可以了,bindLocalIP就是指定綁定了某個IP網卡發送ICMP報文,而不是由gethostname來獲取,因為很簡單,所以代碼就懶得修改了,畢竟是多年前的代碼了。
本人已經在2K(32),XP(32),VISTA(64),WIN7(32)下測試過,一切正常。
2010-12-15日更新補充:這段代碼獲取的是第一個活動網卡IP來發送ICMP報文,如果有多個網卡,例如插網線和wifi網卡同時開,那么就由插網線的網卡發送,如何讓wifi網卡發送呢?很簡單,加一個-p [bindLocalIP]參數就可以了,bindLocalIP就是指定綁定了某個IP網卡發送ICMP報文,而不是由gethostname來獲取,因為很簡單,所以代碼就懶得修改了,畢竟是多年前的代碼了。
本人已經在2K(32),XP(32),VISTA(64),WIN7(32)下測試過,一切正常。
/*******************************************************************
程序: myping
功能: 模擬ping命令
O/S : WINDOWS 98或更高版本
作者: 嚴政
時間: 2007.8.14
版本變更:
V1.0.0 2007.8.14 初始版本,實現了基本的ping功能
說明:
這是開源代碼,你可以隨意拷貝使用。如果你有好的建議或
意見,發E-mail至: [ yzljlss@126.com ]討論。
*******************************************************************/
#include <stdio.h>
#include <WINSOCK2.H>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"Ws2_32.lib")
#define SIO_RECALL _WSAIOW(IOC_VENDOR,1)
#define MAX_HOSTNAME_LEN 256
sockaddr_in LocalAddr,SendAddr,destAddr;
SOCKET sock;
struct hostent FAR *pHostent, *pTmp;
int total = 4;//發送ping報文次數,默認為4次
int seconds = 0;//發送時間間隔
bool hostToIp = false;//-a 將目標的機器標識轉換為ip地址
bool pingforever = false;//-t 若使用者不人為中斷會不斷的ping下去
bool isCount = false;//-c count 要求ping命令連續發送count個數據包
bool isSimple = false;//-q ping只在開始和結束時打印一些概要信息
char FAR name[MAX_HOSTNAME_LEN];
char destIP[16];//目標IP
typedef struct _ping
{
UCHAR i_type;//8位類型
UCHAR i_code;//8位代碼
USHORT i_chksum;//16位ICMP校驗和
USHORT i_identify;//16位標志位
USHORT i_seqnum;//16位序號
ULONG i_timestamp;//32位時間戳
UCHAR i_data[32];//32BYTE選項數據
}PingHeader,*pPingHeader;
typedef struct _ipHeader//IP頭部,總長度20字節
{
#if LITTLEENDIAN
UCHAR IpHlen:4, //4位首部長度
IpVer :4; //4位IP版本號
#else
UCHAR IpVer :4, //4位IP版本號
IpHlen:4; //4位首部長度
#endif
UCHAR IpTos;//8服務類型
USHORT IpTlen;//總長度
USHORT IpId;//標志
USHORT FlagsOff;//分片偏移
UCHAR IpTtl;//生存時間
UCHAR IpProto;//協議
USHORT ChkSum;//檢驗和
struct in_addr SourIp;//源IP地址
struct in_addr DestIp; //目的IP地址
} IpHeader,*pIpHeader;
//求校驗和
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum = 0;
while(size > 1)
{
cksum += *(buffer++);
size -= sizeof(USHORT);
}
if(size)
cksum += *(UCHAR*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
//幫助信息
void help()
{
printf("==========================[ myping V1.0.0 ]============================ ");
printf(" 用法: myping [-a] [-t] [-c count] [-i seconds] [-q] [-h] target_IP ");
printf("參數: ");
printf(" -a 將目標的機器標識轉換為ip地址 ");
printf(" 建議: ping遠程主機時不要添加此參數,否則速度較慢 ");
printf(" -t 若使用者不人為中斷會不斷的ping下去 ");
printf(" -c count 要求ping命令連續發送count個數據包 ");
printf(" -i seconds 在兩次數據包發送之間間隔一定的秒數 ");
printf(" -q myping只在開始和結束時打印一些概要信息 ");
printf(" -h 幫助信息 ");
printf("例如: myping -a -i 1 -c 10 192.168.0.100 ");
printf("=========================[ By 嚴政 07.8.14 ]=========================== ");
}
//發送,解析PING報文
int funPing()
{
unsigned long i,
totalrecv=0;//收到包的數目
unsigned long addr, timestamp,
maxtime = 0,//最大延遲
mintime = 0;//最小延遲
PingHeader ping,*ping_hdr;
char recv_buff[65535];
char szDestIP[16];
int recvLen;
pIpHeader ip_hdr;
SendAddr.sin_family = AF_INET;
SendAddr.sin_addr.s_addr = inet_addr(destIP);
if(hostToIp)
{
memset(name, 0, MAX_HOSTNAME_LEN);
//獲取ping對象主機名
addr = inet_addr(destIP);
pHostent = gethostbyaddr((char *)&addr, sizeof(destIP) , AF_INET);
if(pHostent == NULL)
{
//printf("fail to get host name: %d ",WSAGetLastError());
fprintf(stdout, "Ping %s with 32 bytes of datas: ",destIP);
}
else
fprintf(stdout, "Ping %s[ %s ] with 32 bytes of datas: ", pHostent->h_name, destIP);
}
else
fprintf(stdout, "Ping %s with 32 bytes of datas: ",destIP);
for(i=0;;i++)
{
if(!pingforever)
{
if(i >= (unsigned long)total)//達到發送次數
break;
}
//填充PING報文
ping.i_type = 8;
ping.i_code = 0;
ping.i_seqnum = (USHORT)i;
ping.i_identify = (unsigned short)GetCurrentProcessId();
ping.i_timestamp = (unsigned long)::GetTickCount();
for(int j=0;j < 32; j++)
ping.i_data[i] = (UCHAR)('a'+j);
ping.i_chksum = 0;
//計算校驗和
ping.i_chksum = checksum((unsigned short*)&ping,sizeof(ping));
//printf("checksum=%d ",ping.i_chksum);
if(sendto(sock, (char*)&ping, sizeof(ping),0, (struct sockaddr*)&SendAddr, sizeof(SendAddr)) == SOCKET_ERROR)
{
printf("Send ping packet error: %d ",WSAGetLastError());
return -1;
}
memset(recv_buff, 0, 1024);
int len = sizeof(destAddr);
if((recvLen = recvfrom(sock, recv_buff, sizeof(recv_buff), 0, (struct sockaddr*)&destAddr, &len)) == SOCKET_ERROR)
{
int err = WSAGetLastError();
if(err != 10060)//超時錯誤不返回
{
printf("recv data error: %d ",err);
return -1;
}
else if(!isSimple)
fprintf(stdout, "請求超時. ");
}
if(recvLen > 0)
{
//處理接收的IP報文,解析PING應答報文
ip_hdr = (pIpHeader)recv_buff;
memcpy(szDestIP, inet_ntoa(ip_hdr->SourIp), 16);
if(ip_hdr->IpProto == IPPROTO_ICMP && !strcmp(szDestIP, destIP))//處理來自PING對象且是ICMP的報文
{
ping_hdr = (pPingHeader)(recv_buff + sizeof(unsigned long)*ip_hdr->IpHlen);
// fprintf(stdout,"ping_hdr.i_type=%02X ",ping_hdr->i_type);
// fprintf(stdout,"ping_hdr.i_code=%02X ",ping_hdr->i_code);
// fprintf(stdout,"ping_hdr.i_seqnum=%04X ",ping_hdr->i_seqnum);
// fprintf(stdout,"ping_hdr.i_identify=%04X ",ping_hdr->i_identify);
// fprintf(stdout,"ping_hdr.timestamp=%08X ",ping_hdr->i_timestamp);
//應答報文
if(ping_hdr->i_type == 0)
{
//計算延遲時間
timestamp = (unsigned long)::GetTickCount();
timestamp -= ping_hdr->i_timestamp;
if(i == 0)
mintime = timestamp;
maxtime = (timestamp > maxtime) ? timestamp : maxtime;//最大延遲時間
mintime = (timestamp < mintime) ? timestamp : mintime;//最小延遲時間
if(timestamp == 0)
timestamp = 1;
if(!isSimple)
fprintf(stdout, "Reply from %s: bytes=%d time<%dms TTL=%d ", destIP,
sizeof(ping_hdr->i_data), timestamp, ip_hdr->IpTtl );
//收到包的數目
totalrecv++;
}
if(ping_hdr->i_type == 3)
{
fprintf(stdout, "目的不可達");
switch(ping_hdr->i_code)
{
case 0:
fprintf(stdout, "(網絡不可達) ");
break;
case 1:
fprintf(stdout, "(主機不可達) ");
break;
case 2:
fprintf(stdout, "(協議不可達) ");
break;
case 3:
fprintf(stdout, "(端口不可達) ");
break;
default:
break;
}
}
if(ping_hdr->i_type == 5)
{
if(ping_hdr->i_code == 0)
fprintf(stdout, "對網絡重定向. ");
if(ping_hdr->i_code == 1)
fprintf(stdout, "對主機重定向. ");
}
}
}
Sleep(seconds);
}//end for
//計算ping統計信息
fprintf(stdout, " Ping %s 的統計信息: ",destIP);
fprintf(stdout, " 包: 發送 = %d, 收到 = %d, 丟失 = %d (丟失率: %.0f%%) ",
i, totalrecv, (i-totalrecv), ((float)(i-totalrecv))/i*100 );
if(totalrecv != 0)//沒收到包打印路由信息無意義
{
fprintf(stdout, "近似路由時間(毫秒): ");
fprintf(stdout, " 最大 = %dms, 最小 = %dms, 平均 = %dms ", maxtime, mintime, (maxtime+mintime)/2);
}
return 0;
}
int main(int argc, char* argv[])
{
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0;
int nNetTimeout=3000;//超時3秒
//初始化套結字
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2), &WSAData) != 0)
{
printf("fail to init socket: %d",WSAGetLastError());
return -1;
}
//創建套結字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int));
if(sock == SOCKET_ERROR)
{
printf("fail to create socket: %d",WSAGetLastError());
return -1;
}
//獲取本機IP
if(gethostname(name, MAX_HOSTNAME_LEN))
{
printf("get host name error: %d",WSAGetLastError());
return -1;
}
pHostent = (struct hostent *)malloc(sizeof(struct hostent));
pTmp = pHostent;
pHostent = gethostbyname(name);
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
memcpy(&LocalAddr.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
//bind socket
if(bind(sock, (struct sockaddr *)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR)
{
printf("bind error: %d",WSAGetLastError());
return -1;
}
/*
//置網卡為混雜模式
//在這個ping程序中,不能將網卡置于混雜模式,否則接收的報文包括自己發送的報文 (^_^)
if(WSAIoctl(sock, SIO_RECALL, &lpvBuffer ,sizeof(lpvBuffer), NULL, 0,
&lpcbBytesReturned, NULL, NULL) == SOCKET_ERROR)
{
printf("WSAIoctl(
) error: %d",WSAGetLastError());
return -1;
}
*/
//命令行解析
if(argc < 2)
{
printf("必須輸入ping參數! ");
help();
return -1;
}
else
{
for(int i=1; i < argc; i++)
{
if(argv[i][0] == '-')
{
switch( (tolower(argv[i][1])) )
{
case 'a':
hostToIp = true;
break;
case 't':
pingforever = true;
break;
case 'h':
help();
return -1;
break;
case 'q'://ping只在開始和結束時打印一些概要信息
isSimple = true;
break;
case 'c':
{
if( *(argv[i]+3) > '9' || *(argv[i]+3) < '0' )
{
printf("ping次數錯誤參數! ");
help();
return -1;
}
//發送報文次數
total = atoi(argv[++i]);
break;
}
case 'i'://設置發送報文時間差
{
if( *(argv[i]+3) > '9' || *(argv[i]+3) < '0' )
{
printf("時間錯誤參數! ");
help();
return -1;
}
//發送報文次數
seconds = atoi(argv[++i]) * 1000;
break;
}
default:
break;
}//end switch
}//end if
}//end for
if( (argv[argc-1][0]) > '9' || (argv[argc-1][0]) < '0' )
{
printf("目的IP錯誤!請確認最后一個參數是目的IP. ");
help();
return -1;
}
memcpy(destIP, argv[argc-1], strlen(argv[argc-1]));
}
//發送ping報文
funPing();
free(pTmp);
closesocket(sock);
WSACleanup();
return 0;
}
程序: myping
功能: 模擬ping命令
O/S : WINDOWS 98或更高版本
作者: 嚴政
時間: 2007.8.14
版本變更:
V1.0.0 2007.8.14 初始版本,實現了基本的ping功能
說明:
這是開源代碼,你可以隨意拷貝使用。如果你有好的建議或
意見,發E-mail至: [ yzljlss@126.com ]討論。
*******************************************************************/
#include <stdio.h>
#include <WINSOCK2.H>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"Ws2_32.lib")
#define SIO_RECALL _WSAIOW(IOC_VENDOR,1)
#define MAX_HOSTNAME_LEN 256
sockaddr_in LocalAddr,SendAddr,destAddr;
SOCKET sock;
struct hostent FAR *pHostent, *pTmp;
int total = 4;//發送ping報文次數,默認為4次
int seconds = 0;//發送時間間隔
bool hostToIp = false;//-a 將目標的機器標識轉換為ip地址
bool pingforever = false;//-t 若使用者不人為中斷會不斷的ping下去
bool isCount = false;//-c count 要求ping命令連續發送count個數據包
bool isSimple = false;//-q ping只在開始和結束時打印一些概要信息
char FAR name[MAX_HOSTNAME_LEN];
char destIP[16];//目標IP
typedef struct _ping
{
UCHAR i_type;//8位類型
UCHAR i_code;//8位代碼
USHORT i_chksum;//16位ICMP校驗和
USHORT i_identify;//16位標志位
USHORT i_seqnum;//16位序號
ULONG i_timestamp;//32位時間戳
UCHAR i_data[32];//32BYTE選項數據
}PingHeader,*pPingHeader;
typedef struct _ipHeader//IP頭部,總長度20字節
{
#if LITTLEENDIAN
UCHAR IpHlen:4, //4位首部長度
IpVer :4; //4位IP版本號
#else
UCHAR IpVer :4, //4位IP版本號
IpHlen:4; //4位首部長度
#endif
UCHAR IpTos;//8服務類型
USHORT IpTlen;//總長度
USHORT IpId;//標志
USHORT FlagsOff;//分片偏移
UCHAR IpTtl;//生存時間
UCHAR IpProto;//協議
USHORT ChkSum;//檢驗和
struct in_addr SourIp;//源IP地址
struct in_addr DestIp; //目的IP地址
} IpHeader,*pIpHeader;
//求校驗和
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum = 0;
while(size > 1)
{
cksum += *(buffer++);
size -= sizeof(USHORT);
}
if(size)
cksum += *(UCHAR*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
//幫助信息
void help()
{
printf("==========================[ myping V1.0.0 ]============================ ");
printf(" 用法: myping [-a] [-t] [-c count] [-i seconds] [-q] [-h] target_IP ");
printf("參數: ");
printf(" -a 將目標的機器標識轉換為ip地址 ");
printf(" 建議: ping遠程主機時不要添加此參數,否則速度較慢 ");
printf(" -t 若使用者不人為中斷會不斷的ping下去 ");
printf(" -c count 要求ping命令連續發送count個數據包 ");
printf(" -i seconds 在兩次數據包發送之間間隔一定的秒數 ");
printf(" -q myping只在開始和結束時打印一些概要信息 ");
printf(" -h 幫助信息 ");
printf("例如: myping -a -i 1 -c 10 192.168.0.100 ");
printf("=========================[ By 嚴政 07.8.14 ]=========================== ");
}
//發送,解析PING報文
int funPing()
{
unsigned long i,
totalrecv=0;//收到包的數目
unsigned long addr, timestamp,
maxtime = 0,//最大延遲
mintime = 0;//最小延遲
PingHeader ping,*ping_hdr;
char recv_buff[65535];
char szDestIP[16];
int recvLen;
pIpHeader ip_hdr;
SendAddr.sin_family = AF_INET;
SendAddr.sin_addr.s_addr = inet_addr(destIP);
if(hostToIp)
{
memset(name, 0, MAX_HOSTNAME_LEN);
//獲取ping對象主機名
addr = inet_addr(destIP);
pHostent = gethostbyaddr((char *)&addr, sizeof(destIP) , AF_INET);
if(pHostent == NULL)
{
//printf("fail to get host name: %d ",WSAGetLastError());
fprintf(stdout, "Ping %s with 32 bytes of datas: ",destIP);
}
else
fprintf(stdout, "Ping %s[ %s ] with 32 bytes of datas: ", pHostent->h_name, destIP);
}
else
fprintf(stdout, "Ping %s with 32 bytes of datas: ",destIP);
for(i=0;;i++)
{
if(!pingforever)
{
if(i >= (unsigned long)total)//達到發送次數
break;
}
//填充PING報文
ping.i_type = 8;
ping.i_code = 0;
ping.i_seqnum = (USHORT)i;
ping.i_identify = (unsigned short)GetCurrentProcessId();
ping.i_timestamp = (unsigned long)::GetTickCount();
for(int j=0;j < 32; j++)
ping.i_data[i] = (UCHAR)('a'+j);
ping.i_chksum = 0;
//計算校驗和
ping.i_chksum = checksum((unsigned short*)&ping,sizeof(ping));
//printf("checksum=%d ",ping.i_chksum);
if(sendto(sock, (char*)&ping, sizeof(ping),0, (struct sockaddr*)&SendAddr, sizeof(SendAddr)) == SOCKET_ERROR)
{
printf("Send ping packet error: %d ",WSAGetLastError());
return -1;
}
memset(recv_buff, 0, 1024);
int len = sizeof(destAddr);
if((recvLen = recvfrom(sock, recv_buff, sizeof(recv_buff), 0, (struct sockaddr*)&destAddr, &len)) == SOCKET_ERROR)
{
int err = WSAGetLastError();
if(err != 10060)//超時錯誤不返回
{
printf("recv data error: %d ",err);
return -1;
}
else if(!isSimple)
fprintf(stdout, "請求超時. ");
}
if(recvLen > 0)
{
//處理接收的IP報文,解析PING應答報文
ip_hdr = (pIpHeader)recv_buff;
memcpy(szDestIP, inet_ntoa(ip_hdr->SourIp), 16);
if(ip_hdr->IpProto == IPPROTO_ICMP && !strcmp(szDestIP, destIP))//處理來自PING對象且是ICMP的報文
{
ping_hdr = (pPingHeader)(recv_buff + sizeof(unsigned long)*ip_hdr->IpHlen);
// fprintf(stdout,"ping_hdr.i_type=%02X ",ping_hdr->i_type);
// fprintf(stdout,"ping_hdr.i_code=%02X ",ping_hdr->i_code);
// fprintf(stdout,"ping_hdr.i_seqnum=%04X ",ping_hdr->i_seqnum);
// fprintf(stdout,"ping_hdr.i_identify=%04X ",ping_hdr->i_identify);
// fprintf(stdout,"ping_hdr.timestamp=%08X ",ping_hdr->i_timestamp);
//應答報文
if(ping_hdr->i_type == 0)
{
//計算延遲時間
timestamp = (unsigned long)::GetTickCount();
timestamp -= ping_hdr->i_timestamp;
if(i == 0)
mintime = timestamp;
maxtime = (timestamp > maxtime) ? timestamp : maxtime;//最大延遲時間
mintime = (timestamp < mintime) ? timestamp : mintime;//最小延遲時間
if(timestamp == 0)
timestamp = 1;
if(!isSimple)
fprintf(stdout, "Reply from %s: bytes=%d time<%dms TTL=%d ", destIP,
sizeof(ping_hdr->i_data), timestamp, ip_hdr->IpTtl );
//收到包的數目
totalrecv++;
}
if(ping_hdr->i_type == 3)
{
fprintf(stdout, "目的不可達");
switch(ping_hdr->i_code)
{
case 0:
fprintf(stdout, "(網絡不可達) ");
break;
case 1:
fprintf(stdout, "(主機不可達) ");
break;
case 2:
fprintf(stdout, "(協議不可達) ");
break;
case 3:
fprintf(stdout, "(端口不可達) ");
break;
default:
break;
}
}
if(ping_hdr->i_type == 5)
{
if(ping_hdr->i_code == 0)
fprintf(stdout, "對網絡重定向. ");
if(ping_hdr->i_code == 1)
fprintf(stdout, "對主機重定向. ");
}
}
}
Sleep(seconds);
}//end for
//計算ping統計信息
fprintf(stdout, " Ping %s 的統計信息: ",destIP);
fprintf(stdout, " 包: 發送 = %d, 收到 = %d, 丟失 = %d (丟失率: %.0f%%) ",
i, totalrecv, (i-totalrecv), ((float)(i-totalrecv))/i*100 );
if(totalrecv != 0)//沒收到包打印路由信息無意義
{
fprintf(stdout, "近似路由時間(毫秒): ");
fprintf(stdout, " 最大 = %dms, 最小 = %dms, 平均 = %dms ", maxtime, mintime, (maxtime+mintime)/2);
}
return 0;
}
int main(int argc, char* argv[])
{
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0;
int nNetTimeout=3000;//超時3秒
//初始化套結字
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2), &WSAData) != 0)
{
printf("fail to init socket: %d",WSAGetLastError());
return -1;
}
//創建套結字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int));
if(sock == SOCKET_ERROR)
{
printf("fail to create socket: %d",WSAGetLastError());
return -1;
}
//獲取本機IP
if(gethostname(name, MAX_HOSTNAME_LEN))
{
printf("get host name error: %d",WSAGetLastError());
return -1;
}
pHostent = (struct hostent *)malloc(sizeof(struct hostent));
pTmp = pHostent;
pHostent = gethostbyname(name);
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
memcpy(&LocalAddr.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
//bind socket
if(bind(sock, (struct sockaddr *)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR)
{
printf("bind error: %d",WSAGetLastError());
return -1;
}
/*
//置網卡為混雜模式
//在這個ping程序中,不能將網卡置于混雜模式,否則接收的報文包括自己發送的報文 (^_^)
if(WSAIoctl(sock, SIO_RECALL, &lpvBuffer ,sizeof(lpvBuffer), NULL, 0,
&lpcbBytesReturned, NULL, NULL) == SOCKET_ERROR)
{
printf("WSAIoctl(

return -1;
}
*/
//命令行解析
if(argc < 2)
{
printf("必須輸入ping參數! ");
help();
return -1;
}
else
{
for(int i=1; i < argc; i++)
{
if(argv[i][0] == '-')
{
switch( (tolower(argv[i][1])) )
{
case 'a':
hostToIp = true;
break;
case 't':
pingforever = true;
break;
case 'h':
help();
return -1;
break;
case 'q'://ping只在開始和結束時打印一些概要信息
isSimple = true;
break;
case 'c':
{
if( *(argv[i]+3) > '9' || *(argv[i]+3) < '0' )
{
printf("ping次數錯誤參數! ");
help();
return -1;
}
//發送報文次數
total = atoi(argv[++i]);
break;
}
case 'i'://設置發送報文時間差
{
if( *(argv[i]+3) > '9' || *(argv[i]+3) < '0' )
{
printf("時間錯誤參數! ");
help();
return -1;
}
//發送報文次數
seconds = atoi(argv[++i]) * 1000;
break;
}
default:
break;
}//end switch
}//end if
}//end for
if( (argv[argc-1][0]) > '9' || (argv[argc-1][0]) < '0' )
{
printf("目的IP錯誤!請確認最后一個參數是目的IP. ");
help();
return -1;
}
memcpy(destIP, argv[argc-1], strlen(argv[argc-1]));
}
//發送ping報文
funPing();
free(pTmp);
closesocket(sock);
WSACleanup();
return 0;
}