VC封装Ping命令的实现
需求
网络设备连接PC时,网卡生效比较慢。但是只有当网卡生效了才能开始操作失败,做一些功能测试。这个就需要不断的检测网络状态了。实现思路
封装Ping命令到一个线程类中,在程序启动时开启这个线程。如果能够ping通的话,界面弄个指示灯用来显示状态。实现代码
这个给出封装好的头文件,源文件获取地址: http://download.csdn.net/detail/shufac/9583129ping.h
// Ping.h
#pragma pack(1)
#define ICMP_ECHOREPLY 0
#define ICMP_ECHOREQ 8
class CPing
{
public:
HWND m_hWnd;
void Ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd);
int WaitForEchoReply(SOCKET s);
// ICMP Echo Request/Reply functions
int SendEchoRequest(SOCKET, LPSOCKADDR_IN);
DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *);
u_short in_cksum(u_short *addr, int len);
protected:
void WSAError(LPCSTR pstrFrom);
};
// IP Header -- RFC 791
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;
#define REQ_DATASIZE 32 // Echo Request Data size
// ICMP Echo Request
typedef struct tagECHOREQUEST
{
ICMPHDR icmpHdr;
DWORD dwTime;
char cData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;
// ICMP Echo Reply
typedef struct tagECHOREPLY
{
IPHDR ipHdr;
ECHOREQUEST echoRequest;
char cFiller[256];
}ECHOREPLY, *PECHOREPLY;
#pragma pack()
PingThread.h
// PingThread.h: interface for the CPingThread class.
//
//
#if !defined(AFX_PINGTHREAD_H__88E7C296_2B7A_4A67_AA7B_C89EA8D3BAAC__INCLUDED_)
#define AFX_PINGTHREAD_H__88E7C296_2B7A_4A67_AA7B_C89EA8D3BAAC__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Ping.h"
class CPingThread
{
public:
CPingThread();
virtual ~CPingThread();
UINT m_dwID;
HANDLE m_hThread;
HANDLE m_hKillEvent;
HANDLE m_hSignalEvent;
static UINT __stdcall ThreadProc(void* pThis);
void StartPing(UINT nRetries,CString strHost,HWND hWnd);
CPing m_ping;
CString m_strHost;
HWND m_hWnd;
UINT m_nRetries;
};
#endif // !defined(AFX_PINGTHREAD_H__88E7C296_2B7A_4A67_AA7B_C89EA8D3BAAC__INCLUDED_)
可从文章结尾处提供的链接获取相关的源码。
在VC工程中添加封装好的Ping线程类,声明这个类对象的成员变量,
CPingThread m_pingThread;
在程序启动时调用即可。
m_pingThread.StartPing(0,ini_ipaddress, m_hWnd);
检测状态消息函数定义为,
LRESULT CMTKUpgradeDlg::OnStatus(WPARAM wParam, LPARAM lParam)
{
char* pMsg = (char*) lParam;
ASSERT(pMsg);
const char* pMsgData = NULL;
pMsgData = strstr((const char*)pMsg,"bytes=");
bool bIsConnected=false;
if (pMsgData!=NULL)
{
bIsConnected=true;
}
if (bIsConnected)
{
StateDisplay(3);
}
else
{
StateDisplay(4);
}
delete pMsg;
return 0;
}
LRESULT CMTKUpgradeDlg::OnPingEnd(WPARAM wParam, LPARAM lParam)
{
ASSERT("-End-");
return 0;
}
工程源码获取地址:http://download.csdn.net/detail/shufac/9583129