728x90

Windows Socket Programming

Windows 환경에서 소켓프로그래밍을 공부해보려고 한다.

네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하고 있으므로, 대부분의 네트워크 소켓은 인터넷 소켓이다. 네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.

아래와 같은 요소들로 구성되어있다.

리눅스에서의 소켓 프로그래밍과 거의 동일하다. 하지만 몇가지 더 해줘야 하는것들이 있고, 함수명이 좀 다른 것들이 있다.

우선, 서버와 클라이언트를 만들기 위한 순서를 확인해보자.

서버

  1. Winsock을 초기화합니다.
  2. 소켓을 만듭니다.
  3. 소켓을 바인딩합니다.
  4. 클라이언트에 대한 소켓에서 수신 대기합니다.
  5. 클라이언트에서 연결을 수락합니다.
  6. 데이터를 수신하고 보냅니다.
  7. 연결 끊기를 선택합니다.

클라이언트

  1. Winsock을 초기화합니다.
  2. 소켓을 만듭니다.
  3. 서버에 연결합니다.
  4. 데이터를 보내고 받습니다.
  5. 연결 끊기를 선택합니다.

위에서 말한 리눅스와 다른 부분이 바로 Winsock에 관련된 부분이다.

Windows 환경에서 socket 프로그래밍을 하기 위한 부분으로 꼭 설정해주어야 한다.

서버/클라이언트 모두 필요한 헤더 파일을 확인해보면

#include <winsock2.h>

Winsock2.h 헤더 파일에는 대부분의 Winsock 함수, 구조체 및 정의가 포함되어 있다.

#include <ws2tcpip.h>

Ws2tcpip.h 헤더 파일에는 IP 주소를 검색하는 데 사용되는 최신 함수 및 구조를 포함하는 TCP/IP용 WinSock 2 Protocol-Specific 부록 문서에 도입된 정의가 포함되어 있다.

#pragma comment(lib, "Ws2_32.lib")

Winsock을 사용하는 애플리케이션은 Ws2_32.lib 라이브러리 파일과 연결되어야 한다. #pragma 주석은 링커에 Ws2_32.lib 파일이 필요하다는 것을 나타낸다.

Winsock 함수를 호출하는 모든 프로세스는 Winsock 함수를 호출하기전에 Windows Sockets DLL 사용을 초기화해야 한다.초기화 하는 방법은 아래와 같다.

#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

int main()
{
    WSADATA wsaData; // 1. WSADATA 변수를 하나 만든다.
    int iResult = 0;
    // 2. WSAStartup 함수를 호출한다. 
     // WSAStartup 함수는 WS2_32.dll 사용을 시작하기 위해 호출된다.
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
     if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
    return 1;

    /*...TODO...*/

    WSACleanup() // Winsock 종료
}

WSADATA 구조체에는 Windows 소켓 구현에 대한 정보가 포함되어있다. WSAStartup의 MAKEWORD(2,2) 매개 변수는 시스템에서 Winsock 버전 2.2를 요청하고 전달된 버전을 호출자가 사용할 수 있는 가장 높은 버전의 Windows Sockets 지원으로 설정한다.

위와 같은 과정을 통해 우리는 이제 Winsock 프로그래밍을 하기 위한 출발선에 섰다고 볼 수 있다.

아 그리고 WSAStartup 함수를 통해 초기화하였다면, WSACleanup 함수를 프로그램 종료 전에 호출해주어야 한다.

'Development > Network' 카테고리의 다른 글

멀티프로세싱, 멀티쓰레딩, 멀티플렉싱  (1) 2022.10.03
[Windows Socket] - Client  (0) 2022.09.08
[Windows Socket] - Server  (0) 2022.09.08
복사했습니다!