📄 winpingdlg.cpp
字号:
// WinPingDlg.cpp : implementation file
//
#include "stdafx.h"
#include "WinPing.h"
#include "WinPingDlg.h"
#include <icmpapi.h>
#include <winsock.h>
#include <ipExport.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CWinPingDlg dialog
DWORD CWinPingDlg::Ping(LPVOID param)
{
CWinPingDlg *pDlg=(CWinPingDlg*)param;
WaitForSingleObject(pDlg->m_hEvent,INFINITE);
WSAData wsaData;
//初始化Socket动态链接库
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
return 0;
//将IP地址转换成单字节
USES_CONVERSION;
char *szDestIPAddr=W2A(pDlg->m_ipAddr);
IPAddr ipAddr;
//将目标字符串IP地址转换成IPAddr结构
ipAddr = inet_addr(szDestIPAddr);
if (ipAddr == INADDR_NONE)
{
AfxMessageBox(TEXT("地址无效"));
return 0;
}
// 打开ping服务
HANDLE hIP = IcmpCreateFile();
if (hIP == INVALID_HANDLE_VALUE)
{
AfxMessageBox(TEXT("不能打开Ping服务"));
return 0;
}
// 构造ping数据包
char acPingBuffer[64];
memset(acPingBuffer, '*', sizeof(acPingBuffer));
PICMP_ECHO_REPLY pIpe = (PICMP_ECHO_REPLY)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,
sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer));
if (pIpe == 0)
{
AfxMessageBox(TEXT("分配ping包缓冲区失败"));
return 0;
}
CString m_recv;
// 发送ping数据包
m_recv.Format(_T("Ping %s with 64 Bytes"),pDlg->m_ipAddr);
int nCnt=pDlg->m_lstRecv.GetItemCount();
pDlg->m_lstRecv.InsertItem(nCnt,m_recv,1);
for (UINT i=0;i<pDlg->m_retry;i++)
{
//发送ping服务包,等待接收时间为1秒
DWORD dwStatus = IcmpSendEcho(hIP,ipAddr,
acPingBuffer, sizeof(acPingBuffer), NULL, pIpe,
sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer), 1000);
//当dwStatus不等于0,代表接收到回应
if (dwStatus != 0)
{
m_recv.Format(TEXT("Reply From %d.%d.%d.%d :bytes=%d time=%d TTL=%d")
,int(LOBYTE(LOWORD(pIpe->Address)))
,int(HIBYTE(LOWORD(pIpe->Address)))
,int(LOBYTE(HIWORD(pIpe->Address)))
,int(HIBYTE(HIWORD(pIpe->Address)))
,int(pIpe->DataSize)
,int(pIpe->RoundTripTime)
,int(pIpe->Options.Ttl));
nCnt = pDlg->m_lstRecv.GetItemCount();
pDlg->m_lstRecv.InsertItem(nCnt,m_recv,2);
Sleep(500);
}
else
{
nCnt = pDlg->m_lstRecv.GetItemCount();
pDlg->m_lstRecv.InsertItem(nCnt,TEXT("Error obtaining info from ping packet."),3);
}
}
pDlg->m_bProgress =FALSE;
GlobalFree(pIpe);//释放已分配的内存
IcmpCloseHandle(hIP);//关闭Ping服务
WSACleanup();//释放Socket资源
return 0;
}
CWinPingDlg::CWinPingDlg(CWnd* pParent /*=NULL*/)
: CDialog(CWinPingDlg::IDD, pParent)
, m_nPos(0)
, m_nDir(0)
, m_bProgress(FALSE)
, m_ipAddr(_T("127.0.0.1"))
, m_retry(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CWinPingDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SPIN1, m_spinner);
DDX_Text(pDX, IDC_EDIT2, m_ipAddr);
DDX_Control(pDX, IDC_LIST, m_lstRecv);
DDX_Text(pDX, IDC_RETRIES, m_retry);
}
BEGIN_MESSAGE_MAP(CWinPingDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_WM_TIMER()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BTN_PING, &CWinPingDlg::OnBnClickedBtnPing)
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_btnClear, &CWinPingDlg::OnBnClickedbtnclear)
ON_BN_CLICKED(IDC_btnExit, &CWinPingDlg::OnBnClickedbtnexit)
ON_BN_CLICKED(IDC_btnAbout, &CWinPingDlg::OnBnClickedbtnabout)
END_MESSAGE_MAP()
// CWinPingDlg message handlers
BOOL CWinPingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect rc;
CWnd* pWnd;
m_img.Create(IDB_LOG,16,1,RGB(255,0,255));
pWnd= GetDlgItem(IDC_FROM);
pWnd->GetWindowRect(rc);
ScreenToClient(rc);
m_ptFrom = rc.BottomRight();
m_ptFrom.x+=5;
pWnd= GetDlgItem(IDC_TO);
pWnd->GetWindowRect(rc);
ScreenToClient(rc);
m_ptTo = CPoint(rc.left,rc.bottom);
m_lstRecv.InsertColumn(0,L"状态显示",LVCFMT_LEFT,800);
m_lstRecv.SetImageList(&m_img, LVSIL_SMALL);
m_lstRecv.GetClientRect(rc);
m_lstRecv.SetColumnWidth(0,rc.Width());
m_rcRect.left = m_ptFrom.x;
m_rcRect.right = m_ptTo.x;
m_rcRect.top = m_rcRect.bottom = m_ptFrom.y;
m_rcRect.InflateRect(0,3);
m_spinner.SetRange(1,99);
m_spinner.SetPos(5);
m_nPos = m_ptFrom.x;
m_nDir = 20;
m_hEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CWinPingDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
DRA::RelayoutDialog(
AfxGetInstanceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_WINPING_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_WINPING_DIALOG));
}
#endif
void CWinPingDlg::OnTimer(UINT_PTR nIDEvent)
{
m_nPos += m_nDir;
InvalidateRect(m_rcRect,TRUE);
if (m_nPos > m_ptTo.x)
{
m_nDir = -20;
m_nPos = m_ptTo.x - 5;
}
if (m_nPos < m_ptFrom.x)
{
m_nDir = +20;
m_nPos = m_ptFrom.x + 5;
}
CDialog::OnTimer(nIDEvent);
}
void CWinPingDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
dc.MoveTo(m_ptFrom);
dc.LineTo(m_ptTo);
if (m_bProgress)
{
CRect rc(m_nPos,m_ptTo.y,m_nPos,m_ptTo.y);
rc.InflateRect(3,3);
CBrush br(RGB(255,0,0));
CBrush* pBrush = dc.SelectObject(&br);
dc.Rectangle(rc);
dc.SelectObject(pBrush);
}
CDialog::OnPaint();
}
}
void CWinPingDlg::OnBnClickedBtnPing()
{
HANDLE m_hThread;
int nCnt = m_lstRecv.GetItemCount();
if (nCnt > 0)
m_lstRecv.InsertItem(nCnt,L"",4);
UpdateData(TRUE);
SetEvent(m_hEvent);
SetTimer(1,100,NULL);
m_bProgress = TRUE;
m_hThread=::CreateThread(NULL,0,Ping,this,0,NULL);
if(!m_hThread)
MessageBox(L"建立线程错误!",L"系统信息",MB_OK);
if(m_hThread)
::CloseHandle(m_hThread);
}
HCURSOR CWinPingDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CWinPingDlg::OnBnClickedbtnclear()
{
m_lstRecv.DeleteAllItems();
}
void CWinPingDlg::OnBnClickedbtnexit()
{
CWinPingDlg::OnOK();
}
void CWinPingDlg::OnBnClickedbtnabout()
{
CString str=_T("\n深圳亿道电子有限公司(上海分公司)\r\n\t 李外云博士编写\r\n\tliwyylh@sohu.com");
MessageBox(str,L"关于...",MB_OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -