본문 바로가기

Programming

소켓 프로그래밍

소켓 프로그램이란 : 소켓은 컴퓨터를 네트워크에 접속시키는 역할, 그러한 소켓을 이용한 프로그래밍

###잘못된 내용이 있다면 알려주세요!

 

 

#이론

네트워크에서 데이터들이 전송되는 방식

네트워크에서 돌아다니는 데이터의 규모와 용도는 굉장히 다양합니다.

이러한 데이터들의 전송을 관리하려면 일정한 규칙이 필요했습니다. 때문에 작은 데이터 하나를 전송해도 수많은 규칙에 따라 패키징 되어 전송되게 되는데, 그 수많은 규칙들을 프로토콜이라고 합니다.

 

TCP/IP 4계층

 

TCP/IP 4계층

응용 계층 : 어떤 데이터인지

전송 계층 : 어떻게 보낼 것인지

인터넷 계층 : 전달

네트워크 계층 : 전달(네트워크 하드웨어, 드라이버)

 

ex) 실시간 데이터가 전송이 필요하니까 IP주소로 UDP방식을 통해 데이터를 전송해야지

 

 

 

 

#응용

소켓 프로그래밍을 이용해 실시간 PVP전투를 만듭니다.

간단하게 클라이언트들은 소켓을 통해 자신의 위치를 보내고, 서버에서는 이를 저장하고 있다가 클라이언트들에게 위치를 전달합니다. 그러면 클라이언트들은 상대 클라이언트 위치를 알 수 있게 됩니다.

 

 

 

 

실시간으로  빠른 데이터 전송이 필요하기 때문에 UDP를 사용해야하지만 정보손실 기타등등을 처리하는데 시간이 걸릴 것 같기 때문에 TCP를 선택

 

 

 

 

 

소켓 사용한 서버 코드

// ##서버 코드 간략화


// 소켓 생성 : 사용할 주소체계, 소켓타입(TCP), 데이터전송방식 설정
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

// 클라이언트가 접근할 서버의 정보 (IP, 포트)
IPEndPoint ip_point = new IPEndPoint(IPAddress.Any, 9999); // param : IP 주소, 포트 번호
socket.Bind(ip_point);

// 클라이언트 연결까지 대기
socket.Listen(100);
    
// 연결된 클라이언트 소켓 정보 return
Socket client_socket = socket.Accept();

// 소켓 연결되면 쓰레드에서 실행 시킴
Thread client_thread = new Thread(() => RunClient(ref client_socket));
client_thread.Start();


 void RunClient(ref Socket socket)
 {
        while (true)
        {
            socket.Receive(data);
            socket.Send(data);
        }
        socket.Close();
    }

 

 

서버에서 데이터를 받아보았습니다.

심플하게 "x"=1, "y"=2 이런식으로 전달받아 클라이언트에게 보내줍니다. 

실시간 전투는 가능하지만 속도가 느려서 클라이언트끼리 싱크로율이 떨어지는 모습이 보입니다.

 

결론

@TODO TCP -> UDP

@DONE 20200506

 

 

 

 

 

TCP/UDP

 

TCP :

1. 스트림 전송

-빠르게 여러번 전송하면 데이터가 합쳐져서 도착, 즉 패킷 마지막 구분이 안됨

 

2. 서버 소켓 - 클라이언트 소켓 1대 1 연결

- 소켓끼리 연결하는 connect 과정이 필요함

- connect잡히면 해당 소켓끼리만 통신이 시작됨

 

3. 응답 확인 (시간 지연, CPU 소모)

4. 신뢰성이 높다

 

 

 

 

 

UDP :

1.데이터 그램

-메세지 단위로 전송, (65535 바이트 이상은 잘라서 보냄)

 

 

2.속도가 빠르다

 

3.소켓 대신 IP 기반으로 데이터 전송

- 어디 IP에서 어디 IP로 보냅니다 라고 정보 주고 연결해줘야함

 

 


 

 

 

 

더보기

Http통신 GET/POST 을 사용하지 않은 이유

HTTP통신이란?

 

 

www상에서 주고받는 통신이 아니기 때문에 http프로토콜을 사용하지 않았습니다.

응용계층에서 따로 규칙을 만들어서 사용할 수 있다는 의미입니다.

 

 

 

'Programming' 카테고리의 다른 글

빌드 과정  (0) 2020.03.18
[C#] 이란  (1) 2020.03.09
[C++]가상 함수  (0) 2020.03.03
C#의 Delegate - CallBack 만들기  (0) 2020.02.25
오브젝트풀과 옵저버 패턴  (0) 2020.02.25