c 封裝ping程式類

2021-06-08 19:08:10 字數 2884 閱讀 3042

標頭檔案:

#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...