본문 바로가기

과제모음

Thread이용한 다중채팅(Client)

반응형
#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;
}
반응형