ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다중 접속 1대 다 통신 서버 / 클라이언트
    Socket통신/Socket통신 2022. 4. 10. 15:08

    저번 시간에 작성한 다중 접속 코드는 여러 클라이언트 들이 접속이 허용이 되어도 recv() send() 는 개별적으로 통신하는 구조였다.

     

    다중 접속 1대 다 통신 구조에서는 하나의 클라이언트가 데이터를 보내면 다른 클라이언트들도 데이터를 받을 수 있어야 한다.


     

    고민 해야 할것

    1. 하나의 스레드에서 어떻게 접속한 모든 클라이언트에게 전송 할 수 있을까?
    2. 모든 클라이언트는 send()를 호출 해야지만 recv를 받을수 있다.

     

    해결

    1. 서버는 모든 클라이언트에게 데이터를 전송 해주기 위해서는 모든 클라이언트의 주소를 알고 있어야 한다.

       서버는 소켓들을 관리할 필요가 있다.

        accept() 시 통신 소켓 리스트에 소켓을 저장해주고 스레드 종료시 삭제 처리

     

    2. 클라이언트 측에서는 recv()부분을 쓰레드를 생성 하여 send와 recv를 분리 할 것이다.

     

    1대 다 통신 서버 흐름도

     

     

     

    서버측 코드

     

    1. 접속한 클라이언트 소켓들을 관리 및 공유 하기 위해 전역 변수로 SOCKET 리스트를 변수로 선언

     

    2. 클라이언트의 접속 발생시 소켓 리스트에 접속한 클라이언트 소켓 저장!!

     

    변경된 workThread()

    1. workThread() 에서는 send()시 소켓 리스트에 저장된 모든 소켓들에게 데이터를 전송!!

    2. 클라이언트 연결 해제시 소켓 리스트에서 연결 해제된 클라이언트를 찾아 제거 해준다.

     


    클라측 코드

     

    1. 서버 접속 성공시 RecvThread를 생성 한다.

     

    RecvThread를 생성

    2. 이제 메인 쓰레드에서는 send() 만 무한 호출 

      recv는 새로 생성한 세컨쓰레드에서 동작!!

     send recv 분리

     

    RecvThread() 에서는 서버측에서 돌아오는 정보를 무한 수신 하고있다.

     


    결과

    전송한 데이터가 모든 클라이언트 들에게 뿌려지는걸 볼수 있다

    댓글

Designed by Tistory.