네트워크/vmware 실습

6월 19일 1:2채팅 프로그램(수정중)

송시혁 2013. 6. 19. 15:52

서버가 1이고 2가 클라이언트

클라이언트 1이 어떤 메시지를 보내면, 서버가 그것을 받아서 다시 클라이언트0번로 보낸다. 마찬가지로 클라이언트1번으로 메시지를 보내도 서버가 메시지를 받아서 클라이언트0번으로 전송한다.



아래그림은 서버의 그림




클라이언트 0번에서의 화면




클라이언트 1번에서의 화면.



변경된 추가된 변수


int clntSock[MAXUSER];= 클라이언트 소켓을 배열로 만든다. MAXUSER는 2로 define 되어있다.

int tempSock =

int iCnt, iCnt2는 나중에 반복문인 for문을 위해서 사용된 변수



--------------------------------------------소스 분석------------------------------------------------


iMaxSock= servSock+1; //가장 소케번호, select() 함수에 첫 번째 인자로 사용하기 위하여 소켓번호+1로 지정.

기존의 fd_set설정 부분을 반복문 안에 집어넣었다.

두 번째 FD_SET부분에 서버소켓을 첫 번째 인자로 넣는다.





반복뭄이 for문에서 uIuser는 접속자 수를 의미한다. 처음에는 0이므로 for문을 실행하지 않고 select()함수로 가게 된다.

fd_isset()함수에서 1이 반환하게 되면, tempSock에 클라이언트를 받을 때까지 기자리는 accpet()함수를 받는다.


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




--------------------------------------------소스 분석 계속--------------------------------------------



 배열로 선언된 clntSock[uIuser]=tempSock; tempSock()에서 넣어서 

후에 증감시킨다. 처음에는 tempSock이 0이므로 증감되어 1이 화면에 출력된다.

접속자 확인 부분이다. 클라이언트가 접속하면, 위에 for문 코드에 의해 화면에 접속자 수가 출력된다.


else if()

read()함수로 키보드로 읽어들여서 다음, for문이 실행되고, 클라이언트[0]자리에 키보드로부터 입력받은 데이터를 각 클라이언트에 보내게 된다.(클라이언트, 접속자 수가 1명인 경우)




그리고 다시 반복문에 의해 while문으로 올라간다.



이번에는 for문이 실행된다. uIuser가 1이므로 0보다 크다. for문을 실행한다.

FD_SET()함수에서 클라이언트[0]자리에 1로 넣는다.

그리고 if문을 실행한다. iMaxSock는 2로 정의 되어 있으므로 2<=clntSock[iCnt2-1]이 된다.

조건을 만족한다면, iMaxSock에 



그리고 아래에 printf문에 iCnt-1을 한 이유는 iCnt가 지금 1이므로 -1을 하면 배열번호가 0이 되어 clntSock[0]이 출력된다.