#include <WinSock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define  LINE 1024
DWORD WINAPI ProcessInputSend(LPVOID arg);
char *escape = "exit";
char userID[10]; // 유저ID
char line[LINE], chatdata[LINE+1];
struct sockaddr_in server_addr;
SOCKET serversocket; // 서버 연결 소켓
int main(){
	WSADATA wsa; // 소켓
	HANDLE hThread; // 스레드
	DWORD ThreadId;
	int size;
	// 유저ID 입력
	printf("Input ID : ");
	gets(userID);
	// 소켓 초기화
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0){
		exit(1);
	}
	// 소켓 생성
	if((serversocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){
		printf("fail make socket\n");
		exit(0);
	}
	// 메모리 초기화
	ZeroMemory(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET; // 소켓 인자들 설정
	server_addr.sin_port = htons(2600);
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	// 서버와 연결
	if(connect(serversocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
		printf("fail connect 2 server\n");
		exit(0);
	}
	else{
		printf("connected server\n");
	}
	// 스레드 생성
	hThread = CreateThread(NULL, 0, ProcessInputSend, 0, 0, &ThreadId);
	if(hThread == NULL){
		printf("fail make thread\n");
	}
	else{
		CloseHandle(hThread);
	}
	while(1){
		ZeroMemory(chatdata, sizeof(chatdata));
		if((size = recv(serversocket, chatdata, LINE, 0)) == INVALID_SOCKET){
			printf("recv ERROR\n");
			exit(0);
		}
		else{
			chatdata[size] = '\0';
			printf("%s\n", chatdata);
		}
	}
	closesocket(serversocket);
	WSACleanup();
}
DWORD WINAPI ProcessInputSend(LPVOID arg){ // 사용자 입력
	while(TRUE){
		if(fgets(chatdata, LINE, stdin)){ // 스트림 read
			sprintf(line, "\n[%s] : %s", userID, chatdata); // 버퍼의 첫 내용을 출력
			if(send(serversocket, line, strlen(line), 0) < 0){
				printf("Write fail\n");
			}
			if(strcmp(escape, "exit") == 0){ // 종료명령어
				printf("Bye\n");
				closesocket(serversocket);
				exit(0);
			}
		}
	}
	return 0;
}