TCP/IP 프로그래밍 - 소켓 통신

2020. 12. 19. 19:42·C, C++, MFC

소켓 (Socket)

TCP/IP 프로토콜을 이용하는 네트워크 프로그램을 개발하기 위한 인터페이스를 소켓이라고 한다.

 

Server / Client 간 네트워크 통신

Server : 정보나 서비스를 제공하는 쪽

Client : 서버로부터 제공받는 쪽

 

특정 프로그램에서 데이터를 전송하기 위해서는, IP 주소로 특정 컴퓨터를 지정하고, 포트 번호로 그 컴퓨터에서 수행 중인 특정 프로그램을 지정한다.

 

클라이언트가 서버에 접속하여 데이터를 주고 받기 위해서는 모두 3개의 소켓이 필요하다. 서버와 클라이언트가 데이터를 주고받기 위한 각각의 소켓과, 서버가 클라이언트의 접속 요청을 받아들이기 위한 소켓을 별도로 가지고 있어야 한다.

클라이언트-서버 간 데이터 통신 과정

Server

  1. Create 함수를 호출하여 서버 소켓을 생성한다.
  2. Listen 함수를 호출하여 클라이언트의 접속 요청을 감지하기 시작한다.
  3. 클라이언트로부터 접속 요청을 받으면 별도의 데이터 소켓을 생성하고, Accept 함수를 호출하여 새로 생성된 소켓과 클라이언트를 연결시켜준다.
    • Accept 함수에 의해 클라이언트와 연결된 데이터 소켓이 클라이언트와 데이터를 주고 받는 일을 담당한다.
    • 데이터를 보낼 때는 Send, 받을 때는 Receive 함수를 호출한다.
  4. 다른 클라이언트로부터의 접속 요청을 기다린다.

 

Client

  1. Create 함수를 호출하여 클라이언트 소켓을 생성한다.
  2. 서버의 IP, Port를 지정하여 Connect 함수를 호출하여 서버에 접속한다.

 

소켓 클래스

CAsyncSocket

소켓 인터페이스에 필요한 기능들을 클래스로 만들어 놓은 것으로, Non-Blocking 모드에서 동작한다.

함수 기능
소켓 생성과 종료
Create 소켓 오브젝트를 생성한다.
Close 소켓을 닫는다. 이 함수는 CAsyncSocket의 소멸자 함수에서 호출된다.
OnClose 연결된 소켓이 닫힐 때 호출된다.
서버 소켓의 기능
Listen 클라이언트의 접속 요청을 감지하기 시작한다.
Accept 클라이언트의 접속 요청을 받아들여, 새로운 소켓과 접속 요청을 한 클라이언트 소켓을 연결시켜 준다.
OnAccept Listen 함수를 호출하고 클라이언트의 접속 요청을 기다리고 있는 서버 소켓에 클라이언트로부터 접속 요청이 있을 때 호출된다. 일반적으로 접속 요청이 있을 때 접속을 받아들이기 위해 Accept 함수를 호출하므로 이 함수를 재정의한 후 그 안에서 Accept 함수를 호출한다.
클라이언트 소켓의 기능
Connect 서버에 접속 요청을 한다. 인자로 접속하고자 하는 서버의 IP 주소와 포트 번호를 넘겨준다.
OnConnect Connect 함수 호출에 의한 접속 요구가 받아들여져, 클라이언트가 서버에 연결됐을 때 호출된다.
데이터를 주고 받는 기능
Send 데이터를 보낸다.
OnSend 데이터가 모두 전송되어 다시 Send 함수를 호출하여 데이터를 전송할 수 있을 때 호출된다.
Receive 데이터를 받는다. 수신된 데이터는 윈도우 운영체제가 보관하고 있는데 Receive 함수는 윈도우 운영체제가 보관하고 있는 수신 데이터를 가져오는 기능을 수행한다.
OnReceive 새로운 데이터가 수신되었을 때 호출된다. 일반적으로 새로운 데이터가 수신되었을 때, 이 데이터를 접수하기 위해 Receive 함수를 호출하므로 이 함수를 재정의하여 Receive 함수를 호출하도록 한다.

 

CSocket

CAsyncSocket 클래스에서 상속 받아 추가적인 기능을 더 넣어 만든 것으로, Blocking 모드에서 동작한다.

CAsyncSocket 클래스를 상속 받았기 때문에 Send/Receive 함수를 이용하여 데이터를 주고받을 수 있다.

CArchive 클래스를 이용하여 데이터를 주고 받는 기능도 제공한다. CArchive 클래스를 이용하면 쉽게 데이터를 송신하고 수신할 수 있다. 그러나, MFC로 만들지 않은 프로그램과는 호환되지 않는다.

 

Non-Blocking / Blocking

네트워크 환경에서는 데이터를 전송하거나 받는 함수를 호출했을 때 어느 정도 시간이 걸릴 수 있다. 이렇게 시간이 걸리는 함수를 호출했을 때, Non-Blocking 모드에서는 그 함수의 동작이 완전히 종료될 때까지 기다리지 않고 바로 다음 함수가 실행된다. Blocking 모드에서는 그 함수의 동작이 완전히 종료될 때까지 기다렸다가 다음 함수가 실행된다. Non-Blocking 모드에서는 호출한 함수의 동작이 완료되는 시점을 알아내어 추가적인 작업을 해 주어야 하기 때문에 프로그래밍 하기가 더 까다롭다.

 

Little-Endian / Big-Endian

서로 다른 기종 간 통신을 할 때는 CPU마다 바이트 순서가 다르다는 점에 주의해야 한다. 예를 들어 int 형은 4바이트로 이루어져 있는데, 이렇게 여러 바이트로 되어 있는 데이터형이 하위 바이트부터 먼저 저장되는 방식을 Little-Endian 방식이라고 하고, 상위 바이트부터 저장되는 방식을 Big-Endian 방식이라고 한다.

CSocket 클래스는 이에 대한 처리를 알아서 수행해 주므로 CSocket 클래스를 이용하여 통신할 때는 바이트 순서에 신경 쓰지 않아도 된다.

 

 

socket.pptx
0.04MB

 

저작자표시 비영리 변경금지 (새창열림)

'C, C++, MFC' 카테고리의 다른 글

TCP/IP 프로그래밍 - 채팅 프로그램  (0) 2021.01.06
TCP/IP 프로그래밍 - 범용 소켓 클래스  (0) 2020.12.31
ODBC를 이용한 MFC 데이터베이스 프로그래밍  (1) 2020.12.02
Visual Studio 2008 MFC 프로젝트 생성  (0) 2020.11.30
MFC란?  (0) 2020.11.28
'C, C++, MFC' 카테고리의 다른 글
  • TCP/IP 프로그래밍 - 채팅 프로그램
  • TCP/IP 프로그래밍 - 범용 소켓 클래스
  • ODBC를 이용한 MFC 데이터베이스 프로그래밍
  • Visual Studio 2008 MFC 프로젝트 생성
김고파
김고파
채워나가는 중
  • 김고파
    개발자 김고파
    김고파
  • 전체
    오늘
    어제
    • all
      • C, C++, MFC
        • 따배C++
      • Qt
      • OpenCV
      • Data Structure
      • Dev Tools
      • JAVA
  • 링크

    • github
    • 네이버블로그
    • BOJ
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
김고파
TCP/IP 프로그래밍 - 소켓 통신
상단으로

티스토리툴바