본문 바로가기

과제모음

Select함수를 이용한 1:1 채팅(Client)

반응형
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>     
#include <string.h>     
#include <conio.h>
#include <time.h>

#pragma comment(lib,"ws2_32.lib")

void ErrorHandling(char *message) // 에러메시지 출력
{
printf(message);
exit(0);
}


int main()
{
WSADATA wsaData; // 소켓 변수선언
SOCKET ServerSocket;
SOCKADDR_IN servAddr;
fd_set read_fds;
char chatData[65536];
struct timeval time = {0,0};
char *servIP = "127.0.0.1"; // 로컬호스트연결
int recvn;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) // 소켓 초기화및 연결
ErrorHandling("WSAStartup() error!");

ServerSocket = socket(PF_INET,SOCK_STREAM,0);
if(ServerSocket == INVALID_SOCKET)
ErrorHandling("ServerSocket() error");

memset(&servAddr, 0, sizeof(servAddr)); // 소켓 환경 설정
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(servIP);
servAddr.sin_port = htons(3000);
// 연결
if(connect(ServerSocket,(SOCKADDR*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
ErrorHandling("Connect() Error!");

while(1)
{
FD_ZERO(&read_fds); // 파일 디스크립터 초기화및 옵션지정
FD_SET(ServerSocket,&read_fds);
select(5, (fd_set*)&read_fds, NULL, NULL, &time);

if(FD_ISSET(ServerSocket,&read_fds)) { // 파일 디스크립터의 내용을 읽어옴
recvn = recv(ServerSocket,chatData,sizeof(chatData),0); // 소켓에 수신
if(recvn < 0){
ErrorHandling("recv error\n");
}
printf("Server : %s\n",chatData); // 수신한 데이터 출력
}
if(kbhit()) // 키보드가 입력중일때
{
printf("Send message : "); // 데이터 전송
gets(chatData);
send(ServerSocket,chatData,sizeof(chatData),0);
printf("Client : %s\n",chatData);
}

if(strcmp(chatData, "exit") == 0 ){ // 종료 명령어
break;
}
memset(chatData,0,sizeof(chatData)); // 수신데이터 초기화

}
closesocket(ServerSocket);
WSACleanup();
}
반응형