vivo手机怎样登录三星oppo云服务平台登录的游戏?请告知!

打开微信“扫一扫”,分享到朋友圈
更多有趣好玩的内容
尽在品玩微信公众号
PingWest账号登录
微信扫码登录trackbacks-0
编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习
&&1&/*&&本程序的主要源代码来自MSDN网站,&笔者只是做了一些改进和注释!&另外需要注意的是在Build之前,必须加入ws2_32.lib库文件,
否则会提示"error&LNK2001:"的错误!*/&&2&&&3&/******************************************************************************\&&&4&|&Version&1.1&修改记录:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&&&5&|&&&&&1&&解决了socket阻塞的问题,从而能够正确地处理超时的请求!&&&&&&&&&&&&&&&&&&|&&&6&|------------------------------------------------------------------------------|&&&7&|&Version&1.2&修改记录:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&&&8&|&&&&&1&&增加了由用户控制发送ICMP包的数目的功能(即命令的第二个参数).&&&&&&&&&&&|&&&&&&9&|&&&&&2&&增加了对ping结果的统计功能.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&&10&\******************************************************************************/&&11&&12&#pragma&pack(4)&&13&&14&#include&&WINSOCK2.H&&&&&&&15&#include&&STDIO.H&&&&&&&16&#include&&STDLIB.H&&&17&&18&#define&ICMP_ECHO&8&&19&#define&ICMP_ECHOREPLY&0&&20&&21&#define&ICMP_MIN&8&//&minimum&8&byte&icmp&packet&(just&header)&&22&&23&/*&The&IP&header&*/&&24&typedef&struct&iphdr&{&&25&&&&&unsigned&int&h_len:4;&//&length&of&the&header&&26&&&&&unsigned&int&version:4;&//&Version&of&IP&&27&&&&&unsigned&char&&//&Type&of&service&&28&&&&&unsigned&short&total_&//&total&length&of&the&packet&&29&&&&&unsigned&short&&//&unique&identifier&&30&&&&&unsigned&short&frag_and_&//&flags&&31&&&&&unsigned&char&&&32&&&&&unsigned&char&&//&protocol&(TCP,&UDP&etc)&&33&&&&&unsigned&short&&//&IP&checksum&&34&&35&&&&&unsigned&int&sourceIP;&&36&&&&&unsigned&int&destIP;&&37&&38&}IpH&&39&&40&//&&41&//&ICMP&header&&42&//&&43&typedef&struct&icmphdr&{&&44&&&&&BYTE&i_&&45&&&&&BYTE&i_&/*&type&sub&code&*/&&46&&&&&USHORT&i_&&47&&&&&USHORT&i_&&48&&&&&USHORT&i_&&49&&&&&/*&This&is&not&the&std&header,&but&we&reserve&space&for&time&*/&&50&&&&&ULONG&&&51&}IcmpH&&52&&53&#define&STATUS_FAILED&0xFFFF&&54&#define&DEF_PACKET_SIZE&&&&32&&55&#define&DEF_PACKET_NUMBER&&4&&&&/*&发送数据报的个数&*/&&56&#define&MAX_PACKET&1024&&57&&58&#define&xmalloc(s)&HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))&&59&#define&xfree(p)&HeapFree&(GetProcessHeap(),0,(p))&&60&&61&void&fill_icmp_data(char&*,&int);&&62&USHORT&checksum(USHORT&*,&int);&&63&int&decode_resp(char&*,int&,struct&sockaddr_in&*);&&64&&65&void&Usage(char&*progname){&&66&&67&&&&&fprintf(stderr,"Usage:\n");&&68&&&&&fprintf(stderr,"%s&[number&of&packets]&[data_size]\n",progname);&&69&&&&&fprintf(stderr,"datasize&can&be&up&to&1Kb\n");&&70&&&&&ExitProcess(STATUS_FAILED);&&71&&72&}&&73&int&main(int&argc,&char&**argv){&&74&&75&&&&&WSADATA&wsaD&&76&&&&&SOCKET&sockR&&77&&&&&struct&sockaddr_in&dest,&&78&&&&&struct&hostent&*&&&79&&&&&int&bread,datasize,&&80&&&&&int&fromlen&=&sizeof(from);&&81&&&&&int&timeout&=&1000;&&82&&&&&int&statistic&=&0;&&/*&用于统计结果&*/&&&83&&&&&char&*dest_&&84&&&&&char&*icmp_&&85&&&&&char&*&&86&&&&&unsigned&int&addr=0;&&87&&&&&USHORT&seq_no&=&0;&&88&&89&&&&&if&(WSAStartup(MAKEWORD(2,1),&wsaData)&!=&0){&&90&&&&&&&&&fprintf(stderr,"WSAStartup&failed:&%d\n",GetLastError());&&91&&&&&&&&&ExitProcess(STATUS_FAILED);&&92&&&&&}&&93&&94&&&&&if&(argc&&2&)&{&&95&&&&&&&&&Usage(argv[0]);&&96&&&&&}&&97&&&&&sockRaw&=&WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,&0,WSA_FLAG_OVERLAPPED);&&98&&99&&&&&//&100&&&&&//注:为了使用发送接收超时设置(即设置SO_RCVTIMEO,&SO_SNDTIMEO),&101&&&&&//&&&&必须将标志位设为WSA_FLAG_OVERLAPPED&!&102&&&&&//&103&104&&&&&if&(sockRaw&==&INVALID_SOCKET)&{&105&&&&&&&&&fprintf(stderr,"WSASocket()&failed:&%d\n",WSAGetLastError());&106&&&&&&&&&ExitProcess(STATUS_FAILED);&107&&&&&}&108&&&&&bread&=&setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,&109&&&&&&&&&sizeof(timeout));&110&&&&&if(bread&==&SOCKET_ERROR)&{&111&&&&&&&&&fprintf(stderr,"failed&to&set&recv&timeout:&%d\n",WSAGetLastError());&112&&&&&&&&&ExitProcess(STATUS_FAILED);&113&&&&&}&114&&&&&timeout&=&1000;&115&&&&&bread&=&setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,&116&&&&&&&&&sizeof(timeout));&117&&&&&if(bread&==&SOCKET_ERROR)&{&118&&&&&&&&&fprintf(stderr,"failed&to&set&send&timeout:&%d\n",WSAGetLastError());&119&&&&&&&&&ExitProcess(STATUS_FAILED);&120&&&&&}&121&&&&&memset(&dest,0,sizeof(dest));&122&123&&&&&hp&=&gethostbyname(argv[1]);&124&125&&&&&if&(!hp){&126&&&&&&&&&addr&=&inet_addr(argv[1]);&127&&&&&}&128&&&&&if&((!hp)&&&&(addr&==&INADDR_NONE)&)&{&129&&&&&&&&&fprintf(stderr,"Unable&to&resolve&%s\n",argv[1]);&130&&&&&&&&&ExitProcess(STATUS_FAILED);&131&&&&&}&132&133&&&&&if&(hp&!=&NULL)&134&&&&&&&&&memcpy(&(dest.sin_addr),hp-&h_addr,hp-&h_length);&135&&&&&else&136&&&&&&&&&dest.sin_addr.s_addr&=&&137&138&&&&&if&(hp)&139&&&&&&&&&dest.sin_family&=&hp-&h_&140&&&&&else&141&&&&&&&&&dest.sin_family&=&AF_INET;&142&143&&&&&dest_ip&=&inet_ntoa(dest.sin_addr);&144&145&&&&&//&146&&&&&//&&atoi函数原型是:&int&atoi(&const&char&*string&);&147&&&&&//&&The&return&value&is&0&if&the&input&cannot&be&converted&to&an&integer&!&148&&&&&//&149&&&&&if(argc&2)&150&&&&&{&151&&&&&&&&&times=atoi(argv[2]);&152&&&&&&&&&if(times&==&0)&153&&&&&&&&&&&&&times=DEF_PACKET_NUMBER;&154&&&&&}&155&&&&&else&156&&&&&&&&&times=DEF_PACKET_NUMBER;&157&158&&&&&if&(argc&&3)&159&&&&&{&160&&&&&&&&&datasize&=&atoi(argv[3]);&161&&&&&&&&&if&(datasize&==&0)&162&&&&&&&&&&&&&datasize&=&DEF_PACKET_SIZE;&163&&&&&&&&&if&(datasize&&1024)&&&/*&用户给出的数据包大小太大&*/&164&&&&&&&&&{&165&&&&&&&&&&&&&fprintf(stderr,"WARNING&:&data_size&is&too&large&!\n");&166&&&&&&&&&&&&&datasize&=&DEF_PACKET_SIZE;&167&&&&&&&&&}&168&&&&&}&169&&&&&else&170&&&&&&&&&datasize&=&DEF_PACKET_SIZE;&171&172&&&&&datasize&+=&sizeof(IcmpHeader);&173&174&&&&&icmp_data&=&(char*)xmalloc(MAX_PACKET);&175&&&&&recvbuf&=&(char*)xmalloc(MAX_PACKET);&176&177&&&&&if&(!icmp_data)&{&178&&&&&&&&&fprintf(stderr,"HeapAlloc&failed&%d\n",GetLastError());&179&&&&&&&&&ExitProcess(STATUS_FAILED);&180&&&&&}&181&182&183&&&&&memset(icmp_data,0,MAX_PACKET);&184&&&&&fill_icmp_data(icmp_data,datasize);&185&186&&&&&//&187&&&&&//显示提示信息&188&&&&&//&189&&&&&fprintf(stdout,"\nPinging&%s&.\n\n",dest_ip);&190&191&192&&&&&for(int&i=0;i&++i){&193&&&&&&&&&int&&194&195&&&&&&&&&((IcmpHeader*)icmp_data)-&i_cksum&=&0;&196&&&&&&&&&((IcmpHeader*)icmp_data)-&timestamp&=&GetTickCount();&197&198&&&&&&&&&((IcmpHeader*)icmp_data)-&i_seq&=&seq_no++;&199&&&&&&&&&((IcmpHeader*)icmp_data)-&i_cksum&=&checksum((USHORT*)icmp_data,datasize);&200&201&&&&&&&&&bwrote&=&sendto(sockRaw,icmp_data,datasize,0,(struct&sockaddr*)&dest,sizeof(dest));&202&&&&&&&&&if&(bwrote&==&SOCKET_ERROR){&203&&&&&&&&&&&&&if&(WSAGetLastError()&==&WSAETIMEDOUT)&{&204&&&&&&&&&&&&&&&&&printf("Request&timed&out.\n");&205&&&&&&&&&&&&&&&&&continue;&206&&&&&&&&&&&&&}&207&&&&&&&&&&&&&fprintf(stderr,"sendto&failed:&%d\n",WSAGetLastError());&208&&&&&&&&&&&&&ExitProcess(STATUS_FAILED);&209&&&&&&&&&}&210&&&&&&&&&if&(bwrote&&&datasize&)&{&211&&&&&&&&&&&&&fprintf(stdout,"Wrote&%d&bytes\n",bwrote);&212&&&&&&&&&}&213&&&&&&&&&bread&=&recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct&sockaddr*)&from,&fromlen);&214&&&&&&&&&if&(bread&==&SOCKET_ERROR){&215&&&&&&&&&&&&&if&(WSAGetLastError()&==&WSAETIMEDOUT)&{&216&&&&&&&&&&&&&&&&&printf("Request&timed&out.\n");&217&&&&&&&&&&&&&&&&&continue;&218&&&&&&&&&&&&&}&219&&&&&&&&&&&&&fprintf(stderr,"recvfrom&failed:&%d\n",WSAGetLastError());&220&&&&&&&&&&&&&ExitProcess(STATUS_FAILED);&221&&&&&&&&&}&222&&&&&&&&&if(!decode_resp(recvbuf,bread,&from))&223&&&&&&&&&&&&&statistic++;&/*&成功接收的数目++&*/&224&&&&&&&&&Sleep(1000);&225&226&&&&&}&227&228&&&&&/*&229&&&&&Display&the&statistic&result&230&&&&&*/&231&&&&&fprintf(stdout,"\nPing&statistics&for&%s&\n",dest_ip);&232&&&&&fprintf(stdout,"&&&&Packets:&Sent&=&%d,Received&=&%d,&Lost&=&%d&(%2.0f%%&loss)\n",times,&233&&&&&&&&&statistic,(times-statistic),(float)(times-statistic)/times*100);&234&235&236&&&&&WSACleanup();&237&&&&&return&0;&238&239&}&240&/*&241&The&response&is&an&IP&packet.&We&must&decode&the&IP&header&to&locate&242&the&ICMP&data&243&*/&244&int&decode_resp(char&*buf,&int&bytes,struct&sockaddr_in&*from)&{&245&246&&&&&IpHeader&*&247&&&&&IcmpHeader&*&248&&&&&unsigned&short&&249&250&&&&&iphdr&=&(IpHeader&*)&251&252&&&&&iphdrlen&=&(iphdr-&h_len)&*&4&;&//&number&of&32-bit&words&*4&=&bytes&253&254&&&&&if&(bytes&&&iphdrlen&+&ICMP_MIN)&{&255&&&&&&&&&printf("Too&few&bytes&from&%s\n",inet_ntoa(from-&sin_addr));&256&&&&&}&257&258&&&&&icmphdr&=&(IcmpHeader*)(buf&+&iphdrlen);&259&260&&&&&if&(icmphdr-&i_type&!=&ICMP_ECHOREPLY)&{&261&&&&&&&&&fprintf(stderr,"non-echo&type&%d&recvd\n",icmphdr-&i_type);&262&&&&&&&&&return&1;&263&&&&&}&264&&&&&if&(icmphdr-&i_id&!=&(USHORT)GetCurrentProcessId())&{&265&&&&&&&&&fprintf(stderr,"someone&else's&packet!\n");&266&&&&&&&&&return&1;&267&&&&&}&268&&&&&printf("%d&bytes&from&%s:",bytes,&inet_ntoa(from-&sin_addr));&269&&&&&printf("&icmp_seq&=&%d.&",icmphdr-&i_seq);&270&&&&&printf("&time:&%d&ms&",GetTickCount()-icmphdr-&timestamp);&271&&&&&printf("\n");&272&&&&&return&0;&273&274&}&275&276&277&USHORT&checksum(USHORT&*buffer,&int&size)&{&278&279&&&&&unsigned&long&cksum=0;&280&281&&&&&while(size&&1)&{&282&&&&&&&&&cksum+=*buffer++;&283&&&&&&&&&size&-=sizeof(USHORT);&284&&&&&}&285&286&&&&&if(size)&{&287&&&&&&&&&cksum&+=&*(UCHAR*)&288&&&&&}&289&290&&&&&cksum&=&(cksum&&&&16)&+&(cksum&&&0xffff);&291&&&&&cksum&+=&(cksum&&&16);&292&&&&&return&(USHORT)(~cksum);&293&}&294&/*&295&Helper&function&to&fill&in&various&stuff&in&our&ICMP&request.&296&*/&297&void&fill_icmp_data(char&*&icmp_data,&int&datasize){&298&299&&&&&IcmpHeader&*icmp_&300&&&&&char&*&301&302&&&&&icmp_hdr&=&(IcmpHeader*)icmp_&303&304&&&&&icmp_hdr-&i_type&=&ICMP_ECHO;&305&&&&&icmp_hdr-&i_code&=&0;&306&&&&&icmp_hdr-&i_id&=&(USHORT)GetCurrentProcessId();&307&&&&&icmp_hdr-&i_cksum&=&0;&308&&&&&icmp_hdr-&i_seq&=&0;&309&310&&&&&datapart&=&icmp_data&+&sizeof(IcmpHeader);&311&&&&&//&312&&&&&//&Place&some&junk&in&the&buffer.&313&&&&&//&314&&&&&memset(datapart,'E',&datasize&-&sizeof(IcmpHeader));&315&316&}&317&318&/*******************&附:&ping命令执行时显示的画面&**************\&319&*&&C:\Documents&and&Settings\houzhijiang&ping&236.56.54.12&&&&&&*&320&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&321&*&&Pinging&236.56.54.12&with&32&bytes&of&data:&&&&&&&&&&&&&&&&&&*&322&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&323&*&&Request&timed&out.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&324&*&&Request&timed&out.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&325&*&&Request&timed&out.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&326&*&&Request&timed&out.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&327&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&328&*&&Ping&statistics&for&236.56.54.12:&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&329&*&&&&&Packets:&Sent&=&4,&Received&=&0,&Lost&=&4&(100%&loss),&&&&*&330&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&331&\***************************************************************/&332&333&/***************************************************************\&334&*&&C:\Documents&and&Settings\houzhijiang&ping&127.0.0.1&&&&&&&&&*&335&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&336&*&&Pinging&127.0.0.1&with&32&bytes&of&data:&&&&&&&&&&&&&&&&&&&&&*&337&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&338&*&&Reply&from&127.0.0.1:&bytes=32&time&1ms&TTL=128&&&&&&&&&&&&&&*&339&*&&Reply&from&127.0.0.1:&bytes=32&time&1ms&TTL=128&&&&&&&&&&&&&&*&340&*&&Reply&from&127.0.0.1:&bytes=32&time&1ms&TTL=128&&&&&&&&&&&&&&*&341&*&&Reply&from&127.0.0.1:&bytes=32&time&1ms&TTL=128&&&&&&&&&&&&&&*&342&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&343&*&&Ping&statistics&for&127.0.0.1:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&344&*&&&&&Packets:&Sent&=&4,&Received&=&4,&Lost&=&0&(0%&loss),&&&&&&*&345&*&&Approximate&round&trip&times&in&milli-seconds:&&&&&&&&&&&&&&&*&346&*&&&&&Minimum&=&0ms,&Maximum&=&0ms,&Average&=&0ms&&&&&&&&&&&&&&&*&347&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&348&\***************************************************************/&349
阅读(3991)
阅读排行榜
评论排行榜& & &今天接到需求要实现ping的功能,然后网上查了一些资料,对网络编程的一些函数熟悉了一下,虽然还有一些细节不清楚,但是慢慢积累。
& & &要实现这样的功能:
ping的过程是向目的IP发送一个type=8的ICMP响应请求报文,目标主机收到这个报文之后,会向源IP(发送方,我)回复一个type=0的ICMP响应应答报文。
那上面的字节、往访时间、TTL之类的信息又是从哪来的呢?这取决于IP和ICMP的头部。
头部内容有点多,我们关心的只有以下几个:
IHL:首部长度。因为IP的头部不是定长的,所以需要这个信息进行IP包的解析,从而找到Data字段的起始点。
   &另外注意这个IHL是以4个字节为单位的,所以首部实际长度是IHL*4字节。
Time to Live:生存时间,这个就是TTL了。
Data:这部分是IP包的数据,也就是ICMP的报文内容。
ICMP响应请求/应答报文头部:
Type:类型,type=8表示响应请求报文,type=0表示响应应答报文。
Code:代码,与type组合,表示具体的信息,参考。
Checksum:检验和,这个是整个ICMP报文的检验和,包括Type、Code、...、Data。
Identifier:标识符,这个一般填入本进程的标识符。
Sequence Number:序号
Data:数据部分
上面是标准的ICMP报文,一般而言,统计ping的往返时间的做法是,在ICMP报文的Data区域写入4个字节的时间戳。
在收到应答报文时,取出这个时间戳与当前的时间对比即可。
Ping程序实现步骤
创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。
创建并初始化ICMP头。
调用sendto或WSASendto,将ICMP请求发给远程主机。
调用recvfrom或WSARecvfrom,以接收任何ICMP响应。
#pragma once
//在默认windows.h会包含winsock.h,当你包含winsock2.h就会冲突,因此在包含windows.h前需要定义一个宏,#define WIN32_LEAN_AND_MEAN ;去除winsock.h
//要么将#include &winsock2.h&放在#include&windows.h&前面或者直接去掉#include&windows.h&
#include &winsock2.h&
#pragma comment(lib, "WS2_32")
// 链接到WS2_32.lib
#define DEF_PACKET_SIZE 32
#define ECHO_REQUEST 8
#define ECHO_REPLY 0
struct IPHeader
BYTE m_byVerHL //4位版本+4位首部长度
BYTE m_byTOS; //服务类型
USHORT m_usTotalL //总长度
USHORT m_usID; //标识
USHORT m_usFlagFragO //3位标志+13位片偏移
BYTE m_byTTL; //TTL
BYTE m_byP //协议
USHORT m_usHC //首部检验和
ULONG m_ulSrcIP; //源IP地址
ULONG m_ulDestIP; //目的IP地址
struct ICMPHeader
BYTE m_byT //类型
BYTE m_byC //代码
USHORT m_usC //检验和
USHORT m_usID; //标识符
USHORT m_usS //序号
ULONG m_ulTimeS //时间戳(非标准ICMP头部)
struct PingReply
USHORT m_usS
DWORD m_dwRoundTripT
DWORD m_dwB
DWORD m_dwTTL;
class CPing
BOOL Ping(DWORD dwDestIP, PingReply *pPingReply = NULL, DWORD dwTimeout = 2000);
BOOL Ping(char *szDestIP, PingReply *pPingReply = NULL, DWORD dwTimeout = 2000);
BOOL PingCore(DWORD dwDestIP, PingReply *pPingReply, DWORD dwTimeout);
USHORT CalCheckSum(USHORT *pBuffer, int nSize);
ULONG GetTickCountCalibrate();
SOCKET m_sockR
WSAEVENT m_
USHORT m_usCurrentProcID;
char *m_szICMPD
BOOL m_bIsInitS
static USHORT s_usPacketS
#include "ping.h"
#include &iostream&
USHORT CPing::s_usPacketSeq = 0;
CPing::CPing() :m_szICMPData(NULL),m_bIsInitSucc(FALSE)
WSADATA WSAD
//WSAStartup(MAKEWORD(2, 2), &WSAData);
if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0)
/*如果初始化不成功则报错,GetLastError()返回发生的错误信息*/
printf("WSAStartup() failed: %d\n", GetLastError());
m_event = WSACreateEvent();
m_usCurrentProcID = (USHORT)GetCurrentProcessId();
//setsockopt(m_sockRaw);
/*if ((m_sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0)) != SOCKET_ERROR)
WSAEventSelect(m_sockRaw, m_event, FD_READ);
m_bIsInitSucc = TRUE;
m_szICMPData = (char*)malloc(DEF_PACKET_SIZE + sizeof(ICMPHeader));
if (m_szICMPData == NULL)
m_bIsInitSucc = FALSE;
m_sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
if (m_sockRaw == INVALID_SOCKET)
std::cerr && "WSASocket() failed:" && WSAGetLastError ()&& std::
//10013 以一种访问权限不允许的方式做了一个访问套接字的尝试。
WSAEventSelect(m_sockRaw, m_event, FD_READ);
m_bIsInitSucc = TRUE;
m_szICMPData = (char*)malloc(DEF_PACKET_SIZE + sizeof(ICMPHeader));
if (m_szICMPData == NULL)
m_bIsInitSucc = FALSE;
CPing::~CPing()
WSACleanup();
if (NULL != m_szICMPData)
free(m_szICMPData);
m_szICMPData = NULL;
BOOL CPing::Ping(DWORD dwDestIP, PingReply *pPingReply, DWORD dwTimeout)
return PingCore(dwDestIP, pPingReply, dwTimeout);
BOOL CPing::Ping(char *szDestIP, PingReply *pPingReply, DWORD dwTimeout)
if (NULL != szDestIP)
return PingCore(inet_addr(szDestIP), pPingReply, dwTimeout);
return FALSE;
BOOL CPing::PingCore(DWORD dwDestIP, PingReply *pPingReply, DWORD dwTimeout)
//判断初始化是否成功
if (!m_bIsInitSucc)
return FALSE;
//配置SOCKET
sockaddr_in sockaddrD
sockaddrDest.sin_family = AF_INET;
sockaddrDest.sin_addr.s_addr = dwDestIP;
int nSockaddrDestSize = sizeof(sockaddrDest);
//构建ICMP包
int nICMPDataSize = DEF_PACKET_SIZE + sizeof(ICMPHeader);
ULONG ulSendTimestamp = GetTickCountCalibrate();
USHORT usSeq = ++s_usPacketS
memset(m_szICMPData, 0, nICMPDataSize);
ICMPHeader *pICMPHeader = (ICMPHeader*)m_szICMPD
pICMPHeader-&m_byType = ECHO_REQUEST;
pICMPHeader-&m_byCode = 0;
pICMPHeader-&m_usID = m_usCurrentProcID;
pICMPHeader-&m_usSeq = usS
pICMPHeader-&m_ulTimeStamp = ulSendT
pICMPHeader-&m_usChecksum = CalCheckSum((USHORT*)m_szICMPData, nICMPDataSize);
//发送ICMP报文
if (sendto(m_sockRaw, m_szICMPData, nICMPDataSize, 0, (struct sockaddr*)&sockaddrDest, nSockaddrDestSize) == SOCKET_ERROR)
return FALSE;
//判断是否需要接收相应报文
if (pPingReply == NULL)
return TRUE;
char recvbuf[256] = { "\0" };
while (TRUE)
//接收响应报文
if (WSAWaitForMultipleEvents(1, &m_event, FALSE, 100, FALSE) != WSA_WAIT_TIMEOUT)
WSANETWORKEVENTS netE
WSAEnumNetworkEvents(m_sockRaw, m_event, &netEvent);
if (netEvent.lNetworkEvents & FD_READ)
ULONG nRecvTimestamp = GetTickCountCalibrate();
int nPacketSize = recvfrom(m_sockRaw, recvbuf, 256, 0, (struct sockaddr*)&sockaddrDest, &nSockaddrDestSize);
if (nPacketSize != SOCKET_ERROR)
IPHeader *pIPHeader = (IPHeader*)
USHORT usIPHeaderLen = (USHORT)((pIPHeader-&m_byVerHLen & 0x0f) * 4);
ICMPHeader *pICMPHeader = (ICMPHeader*)(recvbuf + usIPHeaderLen);
if (pICMPHeader-&m_usID == m_usCurrentProcID //是当前进程发出的报文
&& pICMPHeader-&m_byType == ECHO_REPLY //是ICMP响应报文
&& pICMPHeader-&m_usSeq == usSeq //是本次请求报文的响应报文
pPingReply-&m_usSeq = usS
pPingReply-&m_dwRoundTripTime = nRecvTimestamp - pICMPHeader-&m_ulTimeS
pPingReply-&m_dwBytes = nPacketSize - usIPHeaderLen - sizeof(ICMPHeader);
pPingReply-&m_dwTTL = pIPHeader-&m_byTTL;
return TRUE;
if (GetTickCountCalibrate() - ulSendTimestamp &= dwTimeout)
return FALSE;
USHORT CPing::CalCheckSum(USHORT *pBuffer, int nSize)
unsigned long ulCheckSum = 0;
while (nSize & 1)
ulCheckSum += *pBuffer++;
nSize -= sizeof(USHORT);
if (nSize)
ulCheckSum += *(UCHAR*)pB
ulCheckSum = (ulCheckSum && 16) + (ulCheckSum & 0xffff);
ulCheckSum += (ulCheckSum && 16);
return (USHORT)(~ulCheckSum);
ULONG CPing::GetTickCountCalibrate()
static ULONG s_ulFirstCallTick = 0;
static LONGLONG s_ullFirstCallTickMS = 0;
SYSTEMTIME
GetLocalTime(&systemtime);
SystemTimeToFileTime(&systemtime, &filetime);
LARGE_INTEGER liCurrentT
liCurrentTime.HighPart = filetime.dwHighDateT
liCurrentTime.LowPart = filetime.dwLowDateT
LONGLONG llCurrentTimeMS = liCurrentTime.QuadPart / 10000;
if (s_ulFirstCallTick == 0)
s_ulFirstCallTick = GetTickCount();
if (s_ullFirstCallTickMS == 0)
s_ullFirstCallTickMS = llCurrentTimeMS;
return s_ulFirstCallTick + (ULONG)(llCurrentTimeMS - s_ullFirstCallTickMS);
#include &winsock2.h&
#include &stdio.h&
#include "ping.h"
int main(void)
CPing objP
char *szDestIP = "127.0.0.1";
printf("Pinging %s with %d bytes of data:\n", szDestIP, DEF_PACKET_SIZE);
while (TRUE)
objPing.Ping(szDestIP, &reply);
printf("Reply from %s: bytes=%d time=%ldms TTL=%ld\n", szDestIP, reply.m_dwBytes, reply.m_dwRoundTripTime, reply.m_dwTTL);
Sleep(500);
附录:如何计算检验和
ICMP中检验和的计算算法为:
1、将检验和字段置为0
2、把需校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和
3、把得到的结果存入检验和字段中
所谓二进制反码求和,就是:
1、将源数据转成反码
2、0+0=0 & 0+1=1 & 1+1=0进1
3、若最高位相加后产生进位,则最后得到的结果要加1
在实际实现的过程中,比较常见的代码写法是:
1、将检验和字段置为0
2、把需校验的数据看成以16位为单位的数字组成,依次进行求和,并存到32位的整型中
3、把求和结果中的高16位(进位)加到低16位上,如果还有进位,重复第3步[实际上,这一步最多会执行2次]
4、将这个32位的整型按位取反,并强制转换为16位整型(截断)后返回
其中也遇到了很多问题,头文件包含,WSAStartup函数初始化失败。。。
主要参考:
阅读(...) 评论()

我要回帖

更多关于 oppo云服务平台登录 的文章

 

随机推荐