Windows Socket Programming
Windows 환경에서 소켓프로그래밍을 공부해보려고 한다.
네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하고 있으므로, 대부분의 네트워크 소켓은 인터넷 소켓이다. 네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
아래와 같은 요소들로 구성되어있다.
리눅스에서의 소켓 프로그래밍과 거의 동일하다. 하지만 몇가지 더 해줘야 하는것들이 있고, 함수명이 좀 다른 것들이 있다.
우선, 서버와 클라이언트를 만들기 위한 순서를 확인해보자.
서버
- Winsock을 초기화합니다.
- 소켓을 만듭니다.
- 소켓을 바인딩합니다.
- 클라이언트에 대한 소켓에서 수신 대기합니다.
- 클라이언트에서 연결을 수락합니다.
- 데이터를 수신하고 보냅니다.
- 연결 끊기를 선택합니다.
클라이언트
- Winsock을 초기화합니다.
- 소켓을 만듭니다.
- 서버에 연결합니다.
- 데이터를 보내고 받습니다.
- 연결 끊기를 선택합니다.
위에서 말한 리눅스와 다른 부분이 바로 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 |