#define BUFSIZE 1024
#define PORT 3000
#define IP "192.168.2.12"

// 해더파일 선언
#include <winsock2.h>
#include <iostream>

using namespace std;

// ws2_32.lib 링크
#pragma comment(lib, "ws2_32.lib")

class socketClient
{
	private:
		WSADATA wsaData;
		SOCKET hSocket;
		char message[BUFSIZE];
		int strLen;
		SOCKADDR_IN servAddr;
		void ErrorHandling(char *message);

	public:
		int StartClient();

};

int socketClient::StartClient()
{
	// 윈속 초기화 (성공시 0, 실패시 에러 코드리턴)
	if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
		ErrorHandling("WSAStartup() error!"); 
	}

	// 소켓 생성 (성공시 핸들을, 실패시 "INVALID_SOCKET" 반환)
	hSocket=socket(PF_INET, SOCK_STREAM, 0);   
	
	// 소켓 생성 실패 처리
	if(hSocket == INVALID_SOCKET){
		ErrorHandling("socket() error");
	}

	// 매모리 초기화
	memset(&servAddr, 0, sizeof(servAddr));

	// 소켓 통신을 위한 기본 정보 
	servAddr.sin_family=AF_INET;
	servAddr.sin_addr.s_addr=inet_addr(IP);
	servAddr.sin_port=htons(PORT);

	// 서버 커넥트
	if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR){
		ErrorHandling("connect() error!");
	}

	// 루프
	while(1) {

		cout<<"전송할 메시지를 입력하세요 (q to quit) : ";
		cin>>message;

		// q신호 일때 소켓을 끝냄
		if(!strcmp(message,"q")) break;
		
		// 메시지전송
		send(hSocket, message, (int)strlen(message), 0);

		// 메시지 수신
		strLen=recv(hSocket, message, BUFSIZE-1, 0); /* 메시지 수신 */
		
		// 받은 값의 끝에 널값을 붙임.
		message[strLen]=0;
		
		cout << message <<endl;
	}

	// 소켓 종류 신호전송
	closesocket(hSocket);

	// 할당 받은 리소스 반환.
	WSACleanup();
	return 0;
}

void socketClient::ErrorHandling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}




/************************************
/* 
/*	main
/*
*/
int main(){

	// 서버 인스턴트
	socketClient client;
	
	// 서버시작
	client.StartClient();
}