217 lines
5.2 KiB
C++
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);
|
|
//}
|