[해결]RAW 소켓이 생성이 안됩니다.

aavaaa의 이미지

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);
 
 
}

도와주소서~

익명 사용자의 이미지

Windows XP 서비스팩 2 부터인가,, 네트워크 공격을 막을려고 커널단에서 윈속을 이용한 RAW 소켓 생성을 막은걸로 알고 있습니다..

생성하시려면,, Winpcap 과 같은 라이브러리를 이용하세요!!

엄.. 찾아보니 KLDP에도 비슷한 질문이 있었군요..^^

http://kldp.org/node/96898

아마 구글에서 'XP SP2 raw socket' 등으로 검색해보시면 자세히 나올겁니다..

----------------------

http://anster.egloos.com

복군의 이글루

aavaaa의 이미지

Windows7에서는 ROW_SOCKET이 생성이 안되더군요

그래서 ICMP.DLL 을 불러와 사용했습니다.

도움 감사드립니다.