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