VC封装Ping命令的实现

VC封装Ping命令的实现

需求

网络设备连接PC时,网卡生效比较慢。但是只有当网卡生效了才能开始操作失败,做一些功能测试。这个就需要不断的检测网络状态了。

实现思路

封装Ping命令到一个线程类中,在程序启动时开启这个线程。如果能够ping通的话,界面弄个指示灯用来显示状态。

实现代码

这个给出封装好的头文件,源文件获取地址: http://download.csdn.net/detail/shufac/9583129

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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值