/*
프로그램명 : 에코 서버(Echo Server)
프로그래머 : 김은철
저 작 권 : 이 프로그램은 개인의 학습 목적으로만 사용할 수 있으며,
상업적 목적으로 사용할 수 없습니다.
홈페이지 : http://cafe.naver.com/pplus
이 메 일 : polarisgsi@freechal.com, eunchol71@naver.com
*/
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
// ws2_32.lib를 링크 시 사용
#pragma comment( lib, "ws2_32.lib" )
void ErrorDisplay( char *szError );
void main( void )
{
int ret;
//
//.// 소켓 초기화
//
/*
함수 : int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
기능 : WS2_32.DLL의 사용을 초기화한다.
인수 : 버전, WSADATA 구조체의 번지
설명 : 요즘은 보통 Winsock 2.2를 사용하는데,
이렇게 설정하기 위해서 MAKEWORD(2,2)를 사용한다.
반환 : 성공 시 0, 실패 시 에러 코드
주의 : 이 함수는 특별한 경우가 아니면, 한 프로그램에 한 번만 호출하면 된다.
*/
WSADATA wsa;
ret = WSAStartup( MAKEWORD(2,2), &wsa );
if( ret != 0 )
{
ErrorDisplay( "WSAStartup" );
}
/*
함수 : int gethostname( char FAR * name, int namelen );
기능 : 내 컴퓨터가 네트워크 상에 존재하는 호스트 이름을 구한다.
인수 : 1. 호스트 이름을 받을 버퍼
2. 호스트 이름을 받을 버퍼의 크기
설명 : 현재 컴퓨터의 표준 호스트 명(컴퓨터 이름)을 구한다.
반환 : 성공 시 0, 실패 시 SOCKET_ERROR
*/
char szHostName[100];
HOSTENT* pHostEnt;
if( gethostname( szHostName, sizeof(szHostName)) == 0 )
{
printf( "내 컴퓨터 이름 : %s \n", szHostName );
/*
함수 : struct hostent FAR * gethostbyname( const char FAR * name );
기능 : 호스트 이름에 해당하는 호스트 정보를 구한다.
인수 : 1. 호스트 이름
설명 : 호스트 IP를 구할 때 사용한다.
struct hostent {
char FAR * h_name; // 호스트 명
char FAR * FAR * h_aliases; // 호스트의 별명(다른 이름)
short h_addrtype; // 주소 체계
short h_length; // IP 길이
char FAR * FAR * h_addr_list; // IP
};
typedef struct hostent HOSTENT;
여기서 h_addr_list는 호스트 이름이 갖고 있는 IP를 담고 있다.
호스트 IP는 4바이트로 관리되기 때문에, 이를 IN_ADDR 구조체로
복사(memcpy)한 다음, inet_ntoa() 함수를 사용해서 "x.x.x.x"와 같은 형태의
인터넷 IP 문자열로 변환해야 한다. 그리고 경우에 따라서는 호스트 이름에
연관된 여러 개의 IP가 존재할 수 있는데, 이럴 때는
h_addr_list[0], h_addr_list[1], ..., h_addr_list[n] 까지 모두 검색하여
사용할 수 있다. 만약 더 이상 없을 경우는 h_addr_list[n]의 값은 0이 된다.
h_addr은 h_addr_list[0]을 대신해서 사용할 수 있다.
반환 : 성공 시 0, 실패 시 SOCKET_ERROR
*/
if( (pHostEnt = gethostbyname(szHostName)) )
{
IN_ADDR in;
memcpy( &in, pHostEnt->h_addr_list[0], 4 );
printf( "내 컴퓨터 IP : %s \n", inet_ntoa(in) );
}
}
//
//.// 다음 사이트에 대한 모든 IP를 구하는 프로그램
//
printf( "www.daum.net IP 검색 \n" );
pHostEnt = gethostbyname( "www.daum.net" );
if( !pHostEnt )
{
ErrorDisplay( "gethostbyname()" );
}
IN_ADDR addr;
int i = 0;
while( pHostEnt->h_addr_list[i] )
{
memcpy( &addr, pHostEnt->h_addr_list[i++], pHostEnt->h_length );
printf( "[%s] \n", inet_ntoa(addr) );
}
/*
함수 : int WSACleanup( void );
기능 : WS2_32.DLL의 사용을 종료한다.
인수 : 1. 닫을 소켓 디스크립터(s 또는 cs)
설명 : WS2_32.DLL의 사용을 종료한다.
반환 : 성공 시 0, 실패 시 SOCKET_ERROR.
주의 : 프로그램이 닫혀지기 전에 한 번만 호출하면 된다.
만약 프로그램이 실행 중에 이 함수를 호출한다면 모든 소켓은 종료된다.
*/
WSACleanup();
}
/*
함수 : void ErrorDisplay( char *szError )
기능 : 메시지 박스에 에러를 표시하고, 프로그램을 종료(exit)한다.
인수 : WSAGetLastError()-가장 최근에 발생한 소켓 에러의 번호를 리턴함
설명 : FormatMessage 함수는 내부적으로 버퍼를 할당하고, 가장 최근에 발생한
에러에 대한 메시지를 생성한다. 생성된 메시지의 버퍼는 포인터 변수인
lpBuff가 받아 온다.
주의 : FormatMessage 함수는 내부적으로 메모리를 할당하기 때문에 LocalFree
함수를 호출하여 메모리를 해제하여야 한다.
*/
void ErrorDisplay( char *szError )
{
LPVOID lpBuff;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpBuff,
0,
NULL );
MessageBox( NULL, (LPCTSTR)lpBuff, szError, MB_ICONSTOP );
LocalFree( lpBuff );
exit( 0 ); // 프로그램을 종료
}
'웹, HTML' 카테고리의 다른 글
Internet Explorer 버전을 확인 하는 방법 (0) | 2013.06.22 |
---|---|
CoCreateInstance 로 익스플로러 띄우고 IWebBrowser2 인터페이스 얻기,,, 참조) (1) | 2009.11.14 |
웹해킹 베이직, 취약과 방어 (2) | 2009.10.16 |
Ftp 이어 받기, 이어 올리기 구현할 때 (2) | 2009.10.03 |
IOleContainer 를 가지고 enum 객체 생성해 다수의 웹브라우저 컨트롤 구해보는 소스 (4) | 2009.09.28 |
IHTMLWindow2->get_document가 E_ACCESSDENIED를 뱉는 경우(아래와 다른 해결방법) (2) | 2009.09.28 |
IHTMLWindow2::get_document returns E_ACCESSDENIED 뱉을 경우 (3) | 2009.09.28 |