설명
서버에 ping을 전송하여 현재 정상적으로 통신이 되는지 확인하는 코드이다.
하단 코드에 대상서버는 필요에 따라 변경하면 된다.
응답처리부분을 추가 하면은 에러 코드를 확인하여 어떤 네트워크 문제가 있었는지도 확인 가능하다.
(ex: 권한 없음, 호스트 오류, 서버 오류)
전체 코드
#include <iostream>
#include <vector>
#include <string>
#include <afxstr.h>
#include <cstring>
#include <winsock2.h>
#include <mstcpip.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <Windows.h>
#include <WinUser.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sstream>
#include <exception>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
using namespace std;
// 특정 서버 ping 전송 테스트
bool PingtoHost()
{
try
{
// 타겟 주소
std::string target = "www.naver.com";
DWORD pingTimeout = 1000;
char sendData[] = "Ping Test";
HANDLE hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
{
return false;
}
BYTE replyBuffer[1024];
DWORD replySize = sizeof(replyBuffer);
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)replyBuffer;
// 도메인 이름을 IP 주소로 변환
sockaddr_in destAddr;
ZeroMemory(&destAddr, sizeof(destAddr));
destAddr.sin_family = AF_INET;
struct addrinfo* result = nullptr;
struct addrinfo hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
int iResult = getaddrinfo(target.c_str(), NULL, &hints, &result);
if (iResult != 0)
{
IcmpCloseHandle(hIcmpFile);
WSACleanup();
return false;
}
destAddr.sin_addr = ((struct sockaddr_in*)result->ai_addr)->sin_addr;
// ping 전송
DWORD dwResult = IcmpSendEcho(
hIcmpFile,
destAddr.sin_addr.s_addr, // 변환 IP 주소
sendData,
sizeof(sendData),
NULL,
replyBuffer,
replySize,
pingTimeout
);
if (result == 0)
{
DWORD error = GetLastError();
CString errorMessage;
return false;
}
else
{
return true;
}
IcmpCloseHandle(hIcmpFile);
}
catch (std::exception ex)
{
}
}
GitHub
https://github.com/Chaeyunbyun/Network_Utils/blob/main/Http_Utils.cpp
Network_Utils/Http_Utils.cpp at main · Chaeyunbyun/Network_Utils
Http/ Https 통신 및 소켓 통신 관련 함수. Contribute to Chaeyunbyun/Network_Utils development by creating an account on GitHub.
github.com