2021-05-02 15:31:55 +09:00

217 lines
5.2 KiB
C++

#include <stdio.h>
#include <winsock2.h>
#define BUFSIZE 100
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char** argv){
WSADATA wsaData;
SOCKET hServSock;
SOCKADDR_IN servAddr;
int arrIndex;
int clntLen;
SOCKET hClntSock;
SOCKADDR_IN clntAddr;
fd_set reads, tmps;
char message[BUFSIZE];
int strLen;
TIMEVAL timeout;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
fputs("WSADStartup() error", stderr);
hServSock = socket(PF_INET, SOCK_STREAM, 0);
if(hServSock == INVALID_SOCKET)
fputs("socket() error", stderr);
argv[1] = "19999";
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(atoi(argv[1]));
servAddr.sin_family = AF_INET;
if(bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
fputs("bind() error", stderr);
if(listen(hServSock, 5) == SOCKET_ERROR)
fputs("listen() error", stderr);
FD_ZERO(&reads);
FD_SET(hServSock, &reads); //hServSock을 통해 들어오는 것인지 확인
while(1){
tmps = reads;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
//대기하고 있다가 변화가 있으면 리턴
if(select(0, &tmps, 0, 0, &timeout) == SOCKET_ERROR)
fputs("select() error", stderr);
//모든 소켓 핸들을 순회.
for(arrIndex = 0; arrIndex < (int)reads.fd_count; arrIndex++){
if(FD_ISSET(reads.fd_array[arrIndex], &tmps)){
//연결 요청인 경우
if(tmps.fd_array[arrIndex] == hServSock){
clntLen = sizeof(clntAddr);
hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntLen);
//연결이된 클라이언트를 FD_SET에 추가.
FD_SET(hClntSock, &reads);
printf("클라이언트 연결 : 소켓 핸들 %d \n", hClntSock);
}else{ //전송된 데이터가 존재하는 경우. 종료 요청 혹은 데이터 수신.
strLen = recv(tmps.fd_array[arrIndex], message, BUFSIZE-1, 0);
if(strLen == 0){ //종료 요청의 경우.
FD_CLR(tmps.fd_array[arrIndex], &reads);
closesocket(tmps.fd_array[arrIndex]);
printf("클라이언트 종료 : 소켓 핸들 %d \n", tmps.fd_array[arrIndex]);
}else{ //데이터 수신의 경우.
send(tmps.fd_array[arrIndex], message, strLen, 0);
} //else
} //else
} //if
} //for
} //while
WSACleanup();
return 0;
} //main
//#include <stdio.h>
//#include <string.h>
//#include <WinSock2.h>
//
//#pragma comment(lib, "ws2_32.lib")
//
//#define BUFSIZE 100
//
//void ErrorHandling(char *message);
//
//int main(int argc, char **argv)
//{
// WSADATA wsaData;
// SOCKET hServSock;
// SOCKADDR_IN servAddr;
//
// int arrIndex;
// int clntLen;
// SOCKET hClntSock;
// SOCKADDR_IN clntAddr;
//
// fd_set reads, temps;
//
// char message[BUFSIZE];
// int strLen;
// TIMEVAL timeout;
//
// /*if(argc != 2)
// {
// exit(1);
// }*/
//
// if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
// ErrorHandling("e");
//
// hServSock = socket(PF_INET, SOCK_STREAM, 0);
//
// if(hServSock == INVALID_SOCKET)
// ErrorHandling("e");
//
// servAddr.sin_family = AF_INET;
// servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// servAddr.sin_port = 19999;
//
// if(bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR)
// ErrorHandling("e");
//
// if(listen(hServSock, 5)==SOCKET_ERROR)
// ErrorHandling("e");
//
// FD_ZERO(&reads);
// FD_SET(hServSock, &reads);
//
// printf("-1\n");
//
// while(1)
// {
// temps = reads;
// timeout.tv_sec = 5;
// timeout.tv_usec = 0;
//
// if(select(0, &temps, 0, 0, &timeout) == SOCKET_ERROR)
// ErrorHandling("e");
//
// for(arrIndex=0; arrIndex < reads.fd_count; arrIndex++)
// {
// printf("1\n");
// if(FD_ISSET(reads.fd_array[arrIndex], &temps))
// {
// printf("2\n");
// if(reads.fd_array[arrIndex]==hServSock)
// {
// clntLen = sizeof(clntAddr);
// hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntLen);
// FD_SET(hClntSock, &reads);
// printf("클라이언트 연결 : 소켓 핸들 %d \n", hClntSock);
// }
// else
// {
// strLen = recv(reads.fd_array[arrIndex], message, BUFSIZE-1, 0);
// if(strLen == 0)
// {
// closesocket(temps.fd_array[arrIndex]);
// //printf("클라이언트 종료 : 소켓 핸들 %d \n", reads.fd_array[arrIndex]);
// printf("클라이언트 종료 : 소켓 핸들\n");
// FD_CLR(reads.fd_array[arrIndex], &reads);
//
// }
// else
// {
// send(reads.fd_array[arrIndex], message, strLen, 0);
// }
// }
// }
// }
// }
// WSACleanup();
// return 0;
//}
//
//void ErrorHandling(char *message)
//{
// fputs(message, stderr);
// fputc('\n', stderr);
// exit(1);
//}