[해결]RAW 소켓이 생성이 안됩니다.
글쓴이: aavaaa / 작성시간: 수, 2011/06/15 - 11:48오전
ping 프로그램을 C++로 구현하려고 하는데 디버그 해보면 소켓 생성이 안되는 것 같습니다.
여러 사이트에서 소스을 얻어서 활용하려고 했는데 socket 함수의 리턴 값이 언제나 -1 입니다.
개발 환경은 Windows7 VS2010 입니다.
리눅스 환경에서 이 문제에 대한 글은 읽어 봤는데 환경이 달라서인지 해결을 못 하고 있습니다.
방화벽에서 ICMPv4 Enable도 시켜보고 사용자 권한도 변경해 봤지만 아무런 변화가 없습니다.
win7에서는 로우 소켓을 생성할 수 없는 것인지 아님 제가 뭔가 실수 한 것인지 알 수가 없네요
어디선가 구한 소스 코드는
// 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 [%s] 호스트에게 %d 바이트의 자료를 핑합니다.\n",
pstrHost,
inet_ntoa(saDest.sin_addr),
REQ_DATASIZE);
}도와주소서~
Forums:


제 기억에는..
Windows XP 서비스팩 2 부터인가,, 네트워크 공격을 막을려고 커널단에서 윈속을 이용한 RAW 소켓 생성을 막은걸로 알고 있습니다..
생성하시려면,, Winpcap 과 같은 라이브러리를 이용하세요!!
엄.. 찾아보니 KLDP에도 비슷한 질문이 있었군요..^^
http://kldp.org/node/96898
아마 구글에서 'XP SP2 raw socket' 등으로 검색해보시면 자세히 나올겁니다..
----------------------
http://anster.egloos.com
복군의 이글루
[해결]ICMP.DLL 을 사용해서 해결했습니다
Windows7에서는 ROW_SOCKET이 생성이 안되더군요
그래서 ICMP.DLL 을 불러와 사용했습니다.
도움 감사드립니다.