tcp/ip
다중 접속 서버 구현방법
1. 프로세스 생성을 통한 멀티태스킹서버
2. SELECT함수에 의한 멀티플렉싱 서버
3. 쓰레드를 기반으로 하는 멀티쓰레딩 서버
1번방법은 10장 11장에서 보았다.
12장은 2번방법.
1번과 2번 방법의 차이는 다음과 같다.

//fd_set설정
FD_ZERO(&reads);
FD_SET(hServSock,&reads);
while(1)
{
temps = reads; //select호출후 0으로 초기화 되므로 이렇게 해주어야 한다.
timeout.tv_sec = 5; //select호출후 남은시간으로 변경되므로 이렇게 해주어야 한다.
timeout.tv_usec = 0;
if( select(0,&temps,0,0,&timeout)==SOCKET_ERROR ) //temps에 수신데이타가 있는지 관찰하겠다.
ErrorHandling("select() error");
for(arrIndex=0;arrIndex<reads.fd_count;arrIndex++) //reads.fd_count는 계속 바뀔것이다.
{
if(FD_ISSET(reads.fd_array[arrIndex],&temps)) //변화가 생긴 소켓이 있는가.
{
if(reads.fd_array[arrIndex]==hServSock) //변화가 생긴 소켓이 연결요청인경우
{
clntLen = sizeof(clntAddr);
hClntSock = accept(hServSock,(SOCKADDR*)&clntAddr,&clntLen);
FD_SET(hClntSock,&reads); //연결요청을 받아들이고 fd_set에 추가
printf("클라이언트 연결 : 소켓핸들 : %d \n",hClntSock);
}
else
{
strLen = recv(reads.fd_array[arrIndex],message,1024,0);
if(strLen==0)
{
closesocket(temps.fd_array[arrIndex]);
printf("클라이언트 종료 : 소켓핸들 : %d\n",reads.fd_array[arrIndex]);
FD_CLR(reads.fd_array[arrIndex],&reads); //연결종료이면 fd_set에서 삭제
}
else
{
send(reads.fd_array[arrIndex],message,strLen,0);
}
}
}
}
}