네트워크/vmware 실습

6월 20일 VM을 이용한 1:다수 채팅 프로그램

송시혁 2013. 6. 20. 16:13

나머지 위는 저번시간에 배운것과 동일하다. 다시 한 번 select()함수를 살펴본다.



FD_ZERO, FD_SET부분은 위에 주석문을 참고하여 본다.

두 번째 FD_SET부분에서 소켓에 번호를 감지한다.

그리고 SELECT()함수를 호출하여 소켓에 클라이언트로부터 어떤 정보가 들어왔는지, 혹은 이벤트가  발생하지 않았는지를 인식한다.

(이벤트 발생 감지 부분)


SELECT()함수의 인자로 SOCK+1이 되어 있는 것을 알 수 있다. 기본적으로 0,1,2는 키보드, 모니터, 에러이고 그 다음부터 3번부터 보통 SOCK(소켓)의 번호가 부여된다. 첫 번째 인자의 1을 한것은 SELECT함수 설명부분의 +1을 해야한다고

나와있다. 즉, 처음 생성된 소켓의 번호는 4번이 된다. 


FD_ISSET()함수에서 키보드로부터 받은 데이터를 확인하여 정상처리가 된다면, 1을 반환한다. 따라거 조건문인 IF문을 

만족한다면, 아래에 READ()함수나 WRITE()실행된다.


나머지는 위의 주석 설명을 본다.


-------------------------------------------서버 분석-------------------------------------------------




iMaxSock= 소켓번호 +1 그이유는 아래에 select()함수의 첫 번째 인자를 위해서 미리 1을 더한 것이다. 이렇게 굳이 변수로 사용한 이유는

클라이언트가 1개가 아닌, 2,3개 이상의 클라이언트가 접속하기 때문에 소켓의 번호가 변하게 된다. 처음 소켓부터 4,5,6,7...이런식으로 변하기

때문에 변수를 사용했다.


FD_SET부분은 생략. 

----------------------------------------------------------------------------------------------------


바로밑에 for문

처음 소켓을 생성시 uIuser는 0이다 그래서 실행되지 않는다.

바로 select()함수가 기다리고 있다. select()함수에서 클라이언트의 전송하고 있는 정보를 기다린다. 아무런 정보가 없으면, 기다린다.

다섯 번째 인자는 struct timival *timeout 구조체 포인터형의 인자, 보통 0으로 하고 , 무한대기 상태가 된다. 단, 클라이언트로부터 데이터가 소켓으로 왔는지 확인이 된다면, 이 프로그램은 select()함수에서 기다리지 않고 아래로 프로그램이 실행된다.

아래 ,if문은 에러처리부분

그리고 아래 if문에서 FD_ISSET()함수에서 소켓에 데이터가 클라이언트로부터 전송이 되었는지 확인되면, 1을 반환하여 

아래 소스를 실행하게 된다.





accept()함수는 소켓번호를 실제로 넣는 부분. 이것을 tempsock에 넣는다.





실행결과