16,212
社区成员
发帖
与我相关
我的任务
分享
typedef struct tagIPHDR
{
u_char VIHL; // Version and IHL
u_char TOS; // Type Of Service
short TotLen; // Total Length
short ID; // Identification
short FlagOff; // Flags and Fragment Offset
u_char TTL; // Time To Live
u_char Protocol; // Protocol
u_short Checksum; // Checksum
struct in_addr iaSrc; // Internet Address - Source
struct in_addr iaDst; // Internet Address - Destination
}IPHDR, *PIPHDR;
// ICMP Header - RFC 792
typedef struct tagICMPHDR
{
u_char Type; // Type
u_char Code; // Code
u_short Checksum; // Checksum
u_short ID; // Identification
u_short Seq; // Sequence
char Data; // Data
}ICMPHDR, *PICMPHDR;
// ICMP Echo Request
typedef struct tagECHOREQUEST
{
ICMPHDR icmpHdr;
struct timeval echoTime;
char cData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;
// ICMP Echo Reply
typedef struct tagECHOREPLY
{
IPHDR ipHdr;
ECHOREQUEST echoRequest;
char cFiller[256];
}ECHOREPLY, *PECHOREPLY;
int sockfd = 0;
int nRet;
int nCount;
int iSuccess = 0;
struct sockaddr_in addrDest;
struct hostent *Dest;
float spenttime;
if ((Dest=gethostbyname(shost)) == NULL)
{
return false;
}
if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
{
return false;
}
memset((sockaddr_in*)&addrDest, 0, sizeof(struct sockaddr_in));
addrDest.sin_addr = *((struct in_addr *)Dest->h_addr);
addrDest.sin_family = AF_INET;
bzero(&(addrDest.sin_zero), 8);
ECHOREQUEST echoReq;
memset((ECHOREQUEST*)&echoReq, 0, sizeof(struct tagECHOREQUEST));
echoReq.icmpHdr.Type = ICMP_ECHO;
echoReq.icmpHdr.Code = 0;
echoReq.icmpHdr.ID = getpid();
int Seq = 0;
for (nRet = 0; nRet < REQ_DATASIZE; nRet++)
echoReq.cData[nRet] = ' '+nRet;
nCount = 0;
while(nCount < 3)
{
echoReq.icmpHdr.Seq = Seq++;
echoReq.icmpHdr.Checksum = 0;
gettimeofday(&echoReq.echoTime,NULL);
echoReq.icmpHdr.Checksum = checksum((unsigned short*)&echoReq, sizeof(struct tagECHOREQUEST));
if (sendto(sockfd, (ECHOREQUEST*)&echoReq, sizeof(tagECHOREQUEST), 0, (struct sockaddr *)&addrDest, sizeof(addrDest)) < 0)
{
close(sockfd);
return false;
}
if(WaitForEchoReply(sockfd) == -1)
{
close(sockfd);
return false;
}
ECHOREPLY icmpRecv;
int addr_len;
addr_len = sizeof(struct sockaddr);
if (recvfrom(sockfd, (ECHOREPLY*)&icmpRecv, sizeof(struct tagECHOREPLY), 0, (struct sockaddr *)&addrDest, (socklen_t *)&addr_len) < 0)
{
close(sockfd);
return false;
}
else if(icmpRecv.echoRequest.icmpHdr.Type == ICMP_ECHOREPLY)
{
gettimeofday(&icmpRecv.echoRequest.echoTime, NULL);
tv_sub(&icmpRecv.echoRequest.echoTime, &echoReq.echoTime);
spenttime=icmpRecv.echoRequest.echoTime.tv_sec*1000+icmpRecv.echoRequest.echoTime.tv_usec*0.001;
if (strcmp(Dest->h_name, inet_ntoa(icmpRecv.ipHdr.iaSrc))==0)
{
iSuccess ++;
// printf("Reply from %s: Bytes=%d Id_seq = %d time=%4.3fms TTL=%d\n",/*Dest->h_name*/inet_ntoa(icmpRecv.ipHdr.iaSrc), sizeof(icmpRecv.echoRequest), icmpRecv.echoRequest.icmpHdr.Seq, spenttime,icmpRecv.ipHdr.TTL);
}
else
{
; //printf("From %s Id_seq %d Destination Host Unreachable ", inet_ntoa(icmpRecv.ipHdr.iaSrc), icmpRecv.echoRequest.icmpHdr.Seq);
}
// sleep(1);
}
nCount ++;
}
close(sockfd);
if (iSuccess >0)
return true;
else
return false;