Windows循环渐进-Ping程序实现代码
Windows循環(huán)漸進(jìn)書籍中Ping程序?qū)崿F(xiàn)代碼
#include "stdio.h" #include "iostream.h" #include "windows.h" //#include "winsock.h" #pragma comment(lib,"wsock32.lib") #define DEF_BUF_SIZE 1024 #define ICMP_DATA_SIZE 32 #define IP_HEADER_SIZE 20 #define ICMP_HEADER_SIZE 12 #define ICMP_PACK_SIZE ICMP_HEADER_SIZE+ICMP_DATA_SIZE typedef struct _ICMP_HEADER {BYTE bType;//類型BYTE bCode;//代碼USHORT nCheckSum;//校驗(yàn)和USHORT nId;//標(biāo)識(shí)本進(jìn)程IDUSHORT nSequence;//序列號(hào)UINT nTimeStamp;//用于計(jì)算時(shí)間 }ICMP_HEADRE,*PICMP_HEADER;USHORT GetCheckSum(LPBYTE lpBuf,DWORD dwSize) {DWORD dwCheckSum=0;USHORT* lpWord=(USHORT*)lpBuf;while(dwSize>1){dwCheckSum+=*lpWord++;dwSize-=2;}if(dwSize==1){ dwCheckSum+=*((LPBYTE)lpWord); }dwCheckSum=(dwCheckSum>>16)+(dwCheckSum&0xFFFF);//取反return (USHORT)(~dwCheckSum); } BOOL Ping(char* lpDestIp) {SOCKADDR_IN destSockAddr;destSockAddr.sin_family=AF_INET;destSockAddr.sin_addr.S_un.S_addr=inet_addr(lpDestIp);//轉(zhuǎn)換成IPdestSockAddr.sin_port=htons(0);//創(chuàng)建ICMP回顯請(qǐng)求包c(diǎn)har ICMPPack[ICMP_PACK_SIZE]={0};PICMP_HEADER pICMPHeader=(PICMP_HEADER)ICMPPack;pICMPHeader->bType=8;pICMPHeader->bCode=0;pICMPHeader->nId=(USHORT)::GetCurrentProcessId();pICMPHeader->nCheckSum=0;pICMPHeader->nTimeStamp=0;//初始化ICMP可選數(shù)據(jù)區(qū)域,內(nèi)容任意memset(&(ICMPPack[ICMP_HEADER_SIZE]),'E',ICMP_DATA_SIZE);//初始化WINSOCK庫(kù)WORD wVersionRequested=MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(wVersionRequested,&wsaData)!=0){return false;}//創(chuàng)建套接字SOCKET rawSock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);if(rawSock==INVALID_SOCKET){printf("Create Socket error!");return false;}//設(shè)置超時(shí)時(shí)間int nTime=1000;int ret=::setsockopt(rawSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTime,sizeof(nTime));char szRecvBuf[DEF_BUF_SIZE];SOCKADDR_IN SourSockAddr;for(int i=0;i<4;i++){pICMPHeader->nCheckSum=0;//初始校驗(yàn)值為0pICMPHeader->nSequence=i;pICMPHeader->nTimeStamp=::GetTickCount();//當(dāng)前時(shí)間pICMPHeader->nCheckSum=GetCheckSum((LPBYTE)ICMPPack,ICMP_PACK_SIZE);//改善ICMP數(shù)據(jù)包int nRet=::sendto(rawSock,ICMPPack,ICMP_PACK_SIZE,0,(SOCKADDR*)&destSockAddr,sizeof(destSockAddr));if(nRet==SOCKET_ERROR){printf("sendto error!/n");return FALSE;}//接收ICMP響應(yīng)int nLen=sizeof(SourSockAddr);nRet=::recvfrom(rawSock,szRecvBuf,DEF_BUF_SIZE,0,(SOCKADDR*)&SourSockAddr,&nLen);if(nRet==SOCKET_ERROR){if(::WSAGetLastError()==WSAETIMEDOUT){printf("Replay from %s:Timeout/n",inet_ntoa(SourSockAddr.sin_addr));continue;}else{printf("recvfrom error!/n");return FALSE;}}//計(jì)算ICMP數(shù)據(jù)報(bào)的時(shí)間差int nTime=::GetTickCount()-pICMPHeader->nTimeStamp;int nRealSize=nRet-IP_HEADER_SIZE-ICMP_HEADER_SIZE;if(nRealSize<0){printf("To less recv bytes !/n");continue;}PICMP_HEADER pRecvHeader=(PICMP_HEADER)(szRecvBuf+IP_HEADER_SIZE);if(pRecvHeader->bType!=0){printf("Not ICMP Response type!/n");return FALSE;}if(pICMPHeader->nId!=::GetCurrentProcessId()){printf("not valid id!/n");return FALSE;}printf("%d bytes replay from %s: bytes=%d time=%dms/n",nRet,inet_ntoa(SourSockAddr.sin_addr),nRealSize,nTime);::Sleep(1000);}closesocket(rawSock);WSACleanup();return TRUE; } main() { char *lpIpBuf="210.43.32.8";//cin>>lpIpBuf;Ping(lpIpBuf);getchar();return 1; }
總結(jié)
以上是生活随笔為你收集整理的Windows循环渐进-Ping程序实现代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记总结撰写
- 下一篇: 安卓微信打开的文档存放在哪里