윈도우 소켓(Window Sockets) / 윈속(Winsock)

bolee·2022년 4월 4일
1

소켓은 버틀리 유닉스(Berkeley Software Distribution UNIX)에서 개발한 프로그래밍 인터페이스이다.
이를 윈도우 환경에서 사용할 수 있게 만든 것을 윈도우 소켓(Window Sockets), 줄여서 윈속(Winsock)이라고 하며, 윈도우 95 부터 API(Applicaion Programming Interface)에 정식으로 포함하여 제공되고 있다.

윈도우 소켓의 특징

윈도우 소켓은 유닉스 소켓에 기반을 두기 때문에 소스 코드 수준에서 비교적 호환성이 높다. 하지만 아래와 같은 이유로 유닉스 소켓 프로그래밍과 다른 특징이 존재한다.

  • 윈도우 소켓은 DLL(Dynamic-Link Library)를 통해 대부분의 기능이 제공되기 때문에 DLL 초기화 종료 작없을 위한 함수 필요
  • 윈도우 프로그램은 일반적으로 GUI(Graphical User Interface)를 갖추고 메세지 구동 방식으로 동작하기 때문에 이를 위한 확장 함수 존재
  • 윈도우는 운영체제 차원에서 멀티스레드(multithread)를 지원하기 때문에 멀티스레드 환경에서 안정적으로 동작하는 구조와 이를 위한 함수 필요

윈속 1.x 버전은 유닉스 소켓과 호환성을 제공하면서 TCP/IP 프로토콜을 지원한느 것을 목표로 설계되었다. 하지만 2.x 버전부터는 다양한 프로토콜을 지원하도록 구조를 변경하고 함수를 추가하였다.

윈속에서 지원하는 통신 프로토콜

  • TCP/IP
  • IPv6
  • IPv4
  • IrDA
  • Bluetooth

윈속 사용 시 장점

  • 유닉스 소켓과 소스 코드 수준에서 호환성이 높아 기존 코드를 이식하여 활용하기 좋음
  • 가장 널리 사용하는 네트워크 프로그래밍 인터페이스로 여러 운영체제(윈도우, 리눅스 등)에서 사용 가능
  • TCP/IP 외 프로토콜도 지우너하여 최소한의 코드 수정으로 응용 프로그램이 사용할 프로토콜 변경 가능
  • 비교적 저수준(low-level 혹은 mid-level) 프로그래밍 인터페이스이기 때문에 세부 제어가 가능하고 고성능 네트워크 프로그램 개발 가능

윈속 사용 시 단점

  • 응용 프로그램 수준의 프로토콜을 프로그래머가 직접 설계해야 한다. 즉, 데이터 형식이나 전송 절차 등을 고려해 프로그래밍해야 하며, 설계 변경 시 코드 수정이 불가피
  • 서로 다른 바이트 정렬(byte ordering) 방식을 사용하거나 데이터 처리 단위(32비트, 64비트 등)가 서로 다른 호스트끼리 통신할 경우, 응용 프로그램 수준에서 데이터 변환을 처리해야함

윈도우 소켓 구조

(1-15 그림)

윈도우 운영체제는 윈속 응용 프로그램을 위해 그림과 같은 구조를 지원한다. 윈속이 지원하는 대부분의 기능은 WS2_32.DLL로 제공되며, 윈속 1.x 응용 프로그램은 WINSOCK.DLL이나 WSOCK32.DLL을 통해 궁극적으로 WS2_32.DLL의 기능을 사용하게 된다.
표준 윈속 API 외 MS에서 확장한 API가 존재하며 MSWSOCK.DLL로 제공된다. 응용 프로그램이 실제로 사용할 하부 프로토콜은 WS2_32.DLL이 적절히 선택해 연결해준다.

윈도우 소켓 프로그램 맛보기

간단한 윈속 프로그램을 작성해 테스트해보자. 링크에 존재하는 코드를 사용하면 된다.
TCP 클라이언트에서 보낸 데이터를 변경 없이 그대로 화면에 표시하는 TCP 서버를 구현한 것으로 윈도우의 텔넷 클라이언트를 사용해 테스트할 수 있다.

  1. MS 비주얼 스튜디오 2022을 실행한 후 [파일] → [새로 만들기] → [프로젝트...] 메뉴를 선택한다.

  2. [새 프로젝트 만들기] 창에서 'Windows 데스크톱 마법사'를 선택하고 <다음> 버튼을 누른다. [새 프로젝트 구성] 창에서 원하는 프로젝트 이름을 입력하고 프로젝트가 위치할 곳을 지정 후 <만들기> 버튼을 누른다.

  3. [Windows 데스크톱 프로젝트] 창에서 애플리세이션 종류를 '콘솔 애플리케이션(.exe)'을 선택하고 추가 옵션을 '빈 프로젝트'를 선택 후 <확인> 버튼을 누른다.

  4. [솔루션 탐색기]-[소스 파일]에서 마우스 오른쪽 버튼을 눌러 [추가] → [새 항목...] 메뉴를 선택한다. [새 항목 추가] 창에서 [Visual C++]-[코드] 카테고리의 'C++ 파일(.cpp)'을 선택하고 원하는 파일명을 지정 후 <추가> 버튼을 누른다. 확장자를 생략할 경우 .cpp 확장자가 자동을 붙는다.

  5. 새로 추가된 .cpp 파일에 링크에 존재하는 코드를 복사해 넣는다.

참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018

0개의 댓글