標頭檔案:
#pragma once
#include
class cping;
原始檔:
#include "stdafx.h"
#include "ping.h"
#include
#pragma comment(lib, "ws2_32.lib")
#define icmp_echo 8
// 定義回顯報文**
#define icmp_echoreply 0
#define icmp_min 8
// 最小8位元組icmp包
#define max_icmp_packet 1024 // 最大icmp大小
#pragma pack(4)
// ip頭首部結構
struct ipheader
;// icmp 首部結構
struct icmpheader
;cping::cping(void)
cping::~cping(void)
bool cping::init()
;if (wsastartup(makeword(2, 1), &wsadata) != 0)
return false;
return false;
// 設定乙個有接收時限的套接字
int ntimeout = 1000;
int nresult = setsockopt(m_socketraw, sol_socket, so_rcvtimeo, (char*)&ntimeout, sizeof(ntimeout));
if(nresult == socket_error)
return false;
//設定乙個有傳送時限的套接字
ntimeout = 1000;
nresult = setsockopt(m_socketraw, sol_socket, so_sndtimeo, (char*)&ntimeout, sizeof(ntimeout));
if(nresult == socket_error)
return false;
return true;
}bool cping::finit()
bool cping::pinghelper(const char* pdscaddr, int npacknum , int ndatasize )
;hostent* phostent = gethostbyaddr(pdscaddr, strlen(pdscaddr), af_inet);
if (phostent != null)
else
if (m_bprintinfo)
char szicmpdata[max_icmp_packet] = ;
char szrecvbuff[max_icmp_packet] = ;
constructicmpmessage(szicmpdata, ndatasize);
icmpheader* picmpheader = reinterpret_cast(szicmpdata);
int npacksize = ndatasize + sizeof(icmpheader);
int nseqno = 0;
int nret = 0;
sockaddr_in addrsrc = ;
int nrecvpacket = 0;
for (int i = 0; i < npacknum; ++i)
continue;
}return false;
}int nsrclen = sizeof(addrsrc);
nret = recvfrom(m_socketraw, szrecvbuff, sizeof(szrecvbuff), 0, (sockaddr*)&addrsrc, &nsrclen);
if (nret == socket_error)
continue;
}return false;
}if (decodeippacket(szrecvbuff, nret, &addrsrc))
++nrecvpacket;
if (m_bprintinfo)
sleep(1000);
}if (m_bprintinfo)
return nrecvpacket > 0;
}bool cping::constructicmpmessage(char* pdatabuff, int ndatasize)
// 計算校驗和
ushort cping::checksum(ushort* pbuff, int nsize)
if(nsize != 0)
ulchksum = (ulchksum >> 16) + (ulchksum & 0xffff); // 先按32bit計算二進位制和得到cksum,然後把高位低位相加
//得到16bit的和。
ulchksum += (ulchksum >>16); // 把高16位和低16位相加溢位的進製再加到校驗和中
return (ushort)(~ulchksum);
// 取反得到檢驗和
}bool cping::decodeippacket(char* pbuff, int nbuffsize, sockaddr_in* paddr)
return true;
}bool cping::canping(const char* pdscaddr)
void cping::ping(const char* pdscaddr, int npacknum , int npacksize )
使用**示例:
C 製作網路Ping程式
判斷網路是否通達。我們一般會使用命令列下的ping。但如果想在c gui程式中內建ping程式來完成一些功能,可以使用system.net.networkinformation命名空間中的pingreply類來完成所需要的功能。程式介面所用控制項 textbox name txthostnameor...
C 類的封裝
1 private,public,protected的訪問範圍 private 只能由該類中的函式 其友元函式訪問,不能被任何其他訪問,該類的物件也不能訪問.protected 可以被該類中的函式 子類的函式 以及其友元函式訪問,但不能被該類的物件訪問 public 可以被該類中的函式 子類的函式 ...
C 類的封裝
由於專案的需要將自己實現的演算法類封裝為dll介面,供別人的呼叫,學習了一下類的封裝,記錄一下也便以後的檢視。在vs2015中建立一下dll專案,例如exampldll 新增標頭檔案為example.h,裡面定義了dll的介面,可以供別人使用。如下.h檔案 ifdef exampleibdll de...