[해결]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 을 불러와 사용했습니다.
도움 감사드립니다.