반응형
헤더파일
클래스 밖에 선언
typedef struct {
DWORD Address; // Replying address
unsigned long Status; // Reply status
unsigned long RoundTripTime; // RTT in milliseconds
unsigned short DataSize; // Echo data size
unsigned short Reserved; // Reserved for system use
void *Data; // Pointer to the echo data
IP_OPTION_INFORMATION Options; // Reply options
} IP_ECHO_REPLY, *PIP_ECHO_REPLY;
소스파일
#include <winsock2.h>
헤더파일 선언후
아래소스 핑테스트 할곳에 넣음
CString sDestAddress;
WSADATA wsaData;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (nRet)
{
TRACE(_T("WSAStartup() 오류 발생했습니다. 코드 번호 : %d\n"));
WSACleanup();
return;
}
HINSTANCE hIcmp = LoadLibrary(_T("ICMP.DLL"));
if (hIcmp == 0)
{
TRACE(_T("error\n"));
return;
}
// m_EditIpAddress 컨트롤에서 IP를 받아온다 컨트롤 안쓸거면 그냥 CString 형식의 아이피 주소
// _T("xxx.xxx.xxx.xxx") 넣어주면된다
m_EdtIpAddress.GetWindowText(sDestAddress);
// Look up an IP address for the given host name
hostent* phe;
phe = gethostbyname(sDestAddress);
if (phe == 0)
{
TRACE(_T("IP 찾을수없음ㄴ\n"));
return;
}
// Get handles to the functions inside ICMP.DLL that we'll need
typedef HANDLE(WINAPI* pfnHV)(VOID);
typedef BOOL(WINAPI* pfnBH)(HANDLE);
typedef DWORD(WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD, PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); // evil, no?
pfnHV pIcmpCreateFile;
pfnBH pIcmpCloseHandle;
pfnDHDPWPipPDD pIcmpSendEcho;
pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp, "IcmpCreateFile");
pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle");
pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho");
if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0))
{
TRACE(_T("Failed to get proc addr for function.\n"));
FreeLibrary((HINSTANCE)hIcmp);
return;
}
// Open the ping service
HANDLE hIP = pIcmpCreateFile();
if (hIP == INVALID_HANDLE_VALUE) {
TRACE(_T("Unable to open ping service.\n"));
return;
}
// Build ping packet
char acPingBuffer[64];
memset(acPingBuffer, '\xAA', sizeof(acPingBuffer));
PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));
if (pIpe == 0)
{
TRACE(_T("Failed to allocate global ping packet buffer.\n"));
return;
}
pIpe->Data = acPingBuffer;
pIpe->DataSize = sizeof(acPingBuffer);
// Send the ping packet
DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]),
acPingBuffer, sizeof(acPingBuffer), NULL, pIpe,
sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 5000);
CString sLog;
if (dwStatus != 0)
{
sLog.Format(_T("Addr:%d.%d.%d.%d BYTE:%d RTT:%dms TTL:%d\n"),
int(LOBYTE(LOWORD(pIpe->Address))),
int(HIBYTE(LOWORD(pIpe->Address))),
int(LOBYTE(HIWORD(pIpe->Address))),
int(HIBYTE(HIWORD(pIpe->Address))),
pIpe->DataSize,
int(pIpe->RoundTripTime),
int(pIpe->Options.Ttl));
}
else
{
sLog.Format(_T("Error obtaining info from ping packet.\n"));
}
//TRACE(sLog);
// m_ListLog 컨트롤 사용하는건데 콘트롤 없으면 그냥 sLog 가 결과값이므로 이걸 알아서 잘 쓰면 된다.
// CString 형식이다. 그냥 AfxMessageBox에 m_ListLog 변수 찍어보기 바람
m_ListLog.AddString(sLog);
m_ListLog.SetCurSel(m_ListLog.GetCount() - 1);
// Shut down...
GlobalFree(pIpe);
FreeLibrary(hIcmp);
WSACleanup();
반응형
'Dev > [MFC]' 카테고리의 다른 글
[MFC] Grid Control 사용해보기 (0) | 2020.11.13 |
---|---|
[MFC] 멀티바이트 환경에서 유니코드 문자 set하기 (0) | 2020.10.28 |
[MFC] WM_DEVICECHANGE 메시지를 이용한 USB 디바이스 감지 Detect USB devices using WM_DEVICECHANGE messages (1) | 2019.01.18 |