반응형
// ping.cpp -- ICMP 와 RAW 소켓을 사용하는 Ping 프로그램입니다.
//
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include "ping.h"
#pragma comment(lib,"wsock32.lib")
// 내부 함수
void Ping(LPCSTR pstrHost);
void ReportError(LPCSTR pstrFrom);
int WaitForEchoReply(SOCKET s);
u_short in_cksum(u_short *addr, int Len);
// ICMP 에코 요구/응답 함수
int SendEchoRequest(SOCKET, LPSOCKADDR_IN);
DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char*);
// 시작
int main(int argc, char* *argv)
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1,1);
int nRet;
// 인수 비교
if(argc != 2)
{
fprintf(stderr,"\n사용법 : ping [호스트명]\n");
//return 1;
}
// 윈속 시작
nRet = WSAStartup(wVersionRequested, &wsaData);
if(nRet)
{
fprintf(stderr,"\n윈속을 시작하는데 오류 발생했습니다.\n");
return 1;
}
// ping 작업을 합니다.
Ping("localhost");
// 윈속을 비웁니다.
WSACleanup();
return 0;
}
void Ping(LPCSTR pstrHost)
{
SOCKET rawSocket;
LPHOSTENT lpHost;
struct sockaddr_in saDest;
struct sockaddr_in saSrc;
DWORD dwTimeSent;
DWORD dwElapsed;
u_char cTTL;
int nLoop;
int nRet;
// Raw 소켓을 생성합니다.
//===================================================================================
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
printf("%d\n", rawSocket); //<<=== -1 이 출력 되고 다음 if문에서 프로그램이 종료 됩니다.
if(rawSocket == SOCKET_ERROR)
{
ReportError("socket() 함수 문제 발생");
return;
}
//===================================================================================
// 호스트를 찾아 봅니다(Lookup host)
lpHost = gethostbyname(pstrHost);
if(lpHost == NULL)
{
fprintf(stderr, "\n호스트를 찾을수가 없습니다 : %s\n", pstrHost);
return;
}
// 목적지 소켓 주소로 연결을 시도 합니다.
saDest.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr));
saDest.sin_family = AF_INET;
saDest.sin_port = 0;
// 사용자에게 프로그램이 할려고 하는 작업을 표시 합니다.
printf("\n%s [geshifilter-questionmarkphp]s] 호스트에게 %d 바이트의 자료를 핑합니다.\n", pstrHost, inet_ntoa(saDest.sin_addr), REQ_DATASIZE); }
http://laguna.tistory.com/m/2657086
http://whitememo.tistory.com/m/77
//
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include "ping.h"
#pragma comment(lib,"wsock32.lib")
// 내부 함수
void Ping(LPCSTR pstrHost);
void ReportError(LPCSTR pstrFrom);
int WaitForEchoReply(SOCKET s);
u_short in_cksum(u_short *addr, int Len);
// ICMP 에코 요구/응답 함수
int SendEchoRequest(SOCKET, LPSOCKADDR_IN);
DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char*);
// 시작
int main(int argc, char* *argv)
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1,1);
int nRet;
// 인수 비교
if(argc != 2)
{
fprintf(stderr,"\n사용법 : ping [호스트명]\n");
//return 1;
}
// 윈속 시작
nRet = WSAStartup(wVersionRequested, &wsaData);
if(nRet)
{
fprintf(stderr,"\n윈속을 시작하는데 오류 발생했습니다.\n");
return 1;
}
// ping 작업을 합니다.
Ping("localhost");
// 윈속을 비웁니다.
WSACleanup();
return 0;
}
void Ping(LPCSTR pstrHost)
{
SOCKET rawSocket;
LPHOSTENT lpHost;
struct sockaddr_in saDest;
struct sockaddr_in saSrc;
DWORD dwTimeSent;
DWORD dwElapsed;
u_char cTTL;
int nLoop;
int nRet;
// Raw 소켓을 생성합니다.
//===================================================================================
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
printf("%d\n", rawSocket); //<<=== -1 이 출력 되고 다음 if문에서 프로그램이 종료 됩니다.
if(rawSocket == SOCKET_ERROR)
{
ReportError("socket() 함수 문제 발생");
return;
}
//===================================================================================
// 호스트를 찾아 봅니다(Lookup host)
lpHost = gethostbyname(pstrHost);
if(lpHost == NULL)
{
fprintf(stderr, "\n호스트를 찾을수가 없습니다 : %s\n", pstrHost);
return;
}
// 목적지 소켓 주소로 연결을 시도 합니다.
saDest.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr));
saDest.sin_family = AF_INET;
saDest.sin_port = 0;
// 사용자에게 프로그램이 할려고 하는 작업을 표시 합니다.
printf("\n%s [geshifilter-questionmarkphp]s] 호스트에게 %d 바이트의 자료를 핑합니다.\n", pstrHost, inet_ntoa(saDest.sin_addr), REQ_DATASIZE); }
http://laguna.tistory.com/m/2657086
http://whitememo.tistory.com/m/77
반응형