#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>

#define BUFSIZE 512

// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
	LPVOID lpMsgBuf;
	FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER|
		FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, WSAGetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&lpMsgBuf, 0, NULL);
	MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
	LocalFree(lpMsgBuf);
	exit(-1);
}

// 소켓 함수 오류 출력
void err_display(char *msg)
{
	LPVOID lpMsgBuf;
	FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER|
		FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, WSAGetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&lpMsgBuf, 0, NULL);
	printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
	LocalFree(lpMsgBuf);
}

int main(int argc, char* argv[])
{
	int retval;

	// 윈속 초기화
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) 
		return -1;

	// socket()
	SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
	if(listen_sock == INVALID_SOCKET) err_quit("socket()");	
	
	// bind()
	SOCKADDR_IN serveraddr;
	ZeroMemory(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(9000);
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
	if(retval == SOCKET_ERROR) err_quit("bind()");
	
	// listen()
	retval = listen(listen_sock, SOMAXCONN);
	if(retval == SOCKET_ERROR) err_quit("listen()");

	// 데이터 통신에 사용할 변수
	SOCKET client_sock;
	SOCKADDR_IN clientaddr;
	int addrlen;
	char buf[BUFSIZE+1];

	while(1){
		// accept()
		addrlen = sizeof(clientaddr);
		client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);
		if(client_sock == INVALID_SOCKET){
			err_display("accept()");
			continue;
		}
		printf("\n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%d\n",
			inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

		// 클라이언트와 데이터 통신
		while(1){
			// 데이터 받기
			retval = recv(client_sock, buf, BUFSIZE, 0);
			if(retval == SOCKET_ERROR){
				err_display("recv()");
				break;
			}
			else if(retval == 0){
				break;
			}
			else{
				// 받은 데이터 출력
				buf[retval] = '\0';
				printf("%s", buf);

// 데이터 보내기
retval = send(client_sock, buf, retval, 0);
if(retval == SOCKET_ERROR)
{
    err_display("send()");
    break;
} } } // closesocket() closesocket(client_sock); printf("\n[TCP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port)); } // closesocket() closesocket(listen_sock); // 윈속 종료 WSACleanup(); return 0; }

// WIn32 콘솔 프로그램
// 참고로 ws2_32.lib 를 링크 시켜야 함.
#include <winsock2.h>
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
//using namespace std;

// 도메인 이름 -> IP주소로 변환시켜주는 함수
BOOL GetIPAddr(char *name, IN_ADDR *addr)
{
 HOSTENT *ptr = gethostbyname(name);
 if(ptr == NULL)
 {
  MessageBox(NULL,"호스트 네임 받아오는데 실패","실패",MB_OK);
  return FALSE;
 }
 memcpy(addr, ptr->h_addr_list, ptr->h_length);
 return TRUE;
}

//IP주소 -> 도메인 이름
BOOL GetDomainName(IN_ADDR addr, char *name)
{
 HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
 if(ptr == NULL)
 {
  MessageBox(NULL,"도메인 네임 받기 실패","실패",MB_OK);
  return FALSE;
 }
 strcpy(name, ptr->h_name);
 return TRUE;
}

// nslookup 과 같은 프로그램.
int main(int argc, char* argv[])
{
 // 윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;
 MessageBox(NULL,"윈속 초기화 성공", "성공",MB_OK);

 char ipaddress[256];
 cout << "IP주소 입력 하시오 " <<endl;
 gets(ipaddress);
 
 IN_ADDR addr;
 if(GetIPAddr(ipaddress, &addr))
 {
  cout << "IP 주소 " << inet_ntoa(addr) << endl;

  if(GetDomainName(addr,ipaddress))
  {
   cout << "도메인 네임 " << ipaddress << endl;
  }
 }

 // 윈속 종료
 WSACleanup();
 return 0;
}


 //---------- 소켓 생성 부분 ----------//
/* // TCP 소켓 생성
 SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
 if(tcp_sock == INVALID_SOCKET)
 {
  cout << "소켓 에러" << endl;
  return -1;
 }
 MessageBox(NULL,"TCP 소켓 생성 성공","성공",MB_OK);

 // UDP 소켓 생성
 SOCKET udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
 if(udp_sock == INVALID_SOCKET)
 {
  cout << "소켓 에러" << endl;
  return -1;
 }
 MessageBox(NULL,"UDP 소켓 생성 성공","성공",MB_OK);

 // 소켓 구조체 초기화
 SOCKADDR_IN addr;
 ZeroMemory(&addr, sizeof(addr));
 addr.sin_family = AF_INET;
 addr.sin_addr.s_addr = inet_addr("147.46.114.70");
 addr.sin_port = htons(9010);

 char *ipaddr = "147.46.114.70";
 cout << ipaddr << endl;

 cout << "IP 주소 숫자 변환 " << inet_addr(ipaddr) <<endl;

 IN_ADDR temp;
 temp.s_addr = inet_addr(ipaddr);
 cout << "IP 주소 우리가 보게 만들기 " << inet_ntoa(temp) << endl;


 //---------- 소켓 종료 부문 ----------//
 closesocket(tcp_sock);
 closesocket(udp_sock);
*/

// WIn32 콘솔 프로그램
// 참고로 ws2_32.lib 를 링크 시켜야 함.
#include <winsock2.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
 // 윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;
 MessageBox(NULL,"윈속 초기화 성공", "성공",MB_OK);

 //********* 소켓 생성 부분 *********//
 // TCP 소켓 생성
 SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
 if(tcp_sock == INVALID_SOCKET)
 {
  printf("소켓 에러");
  return -1;
 }
 MessageBox(NULL,"TCP 소켓 생성 성공","성공",MB_OK);

 // UDP 소켓 생성
 SOCKET udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
 if(udp_sock == INVALID_SOCKET)
 {
  printf("소켓 에러");
  return -1;
 }
 MessageBox(NULL,"UDP 소켓 생성 성공","성공",MB_OK);

 //********* 소켓 종료 부문 *********//
 closesocket(tcp_sock);
 closesocket(udp_sock);

 // 윈속 종료
 WSACleanup();
 return 0;
}


// 교수님 홈페이지 : www.cs.hongik.ac.kr/~smjang/socket/
// 교수님 메일 : mysonhan@empal.com

+ Recent posts