브로드캐스팅을 위한 소켓 연결에 대해 공부할 필요가 있다고 느껴져, 클로드 코드와 함께 소켓 통신에 대해 공부를 해보고 있다. 현 회사에서 다루고 있지 않은 멀티스레드, 소켓 통신을 독학해야 하는 만큼 어려운 것도 궁금한 것도 많아 블로그 작성과 함께 학습을 해보고자 한다.
소켓은 OS에게 빌리는 물건이다
시작하기 전에 하나만 짚고 가고자 한다. 소켓을 만든다는 건 내가 뭔가를 만들어내는 게 아니다. 패킷을 조립하고 재전송을 관리하는 일은 전부 운영체제가 하고, 나는 그 기능을 쓰게 해달라고 요청할 뿐이다. 그리고 OS가 제공하는 기능이라는 건, OS마다 준비 과정이 다를 수 있다는 뜻이기도 하다.
Winsock 라이브러리 연결
Winsock 함수들은 ws2_32.lib라는 라이브러리에 들어 있어서, 컴파일러에게 이 라이브러리를 같이 링크하라고 알려줘야 한다. 방법은 두 가지인데, 학습 단계에서는 코드 한 줄로 처리하는 방식이 제일 간단하다고 한다. 헤더(winsock2.h)는 '이런 함수가 있다'는 선언만 알려줄 뿐, 함수의 몸통은 ws2_32.lib에 있다. 링크를 빠뜨리면 컴파일은 멀쩡히 통과하고 다음과 같은 에러가 뜬다. 컴파일은 되는데 링크가 안 된다면, 라이브러리를 빠뜨린 것이라고 보면 거의 맞다.
오류 LNK2019 __imp__WSAStartup@8 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
해결 방법은 두 가지인데, 학습 단계에서는 코드 한 줄로 처리하는 방식이 제일 간단하다고 한다.
#pragma comment(lib, "ws2_32.lib")
이 #pragma는 이 소스를 빌드할 때 ws2_32.lib도 함께 링크하는 지시문으로, 코드 안에 해당 지시문을 박아두는 것이 가장 헷갈리지 않는다.
다른 하나는 [프로젝트 속성] → [링커] → [입력] → [추가 종속성]에 등록하는 방식이다. 실무는 이쪽 방식을 사용하나, 지금은 파일 하나로 굴리는 단계니 #pragma로 간다.
동작 확인용 첫 코드
소켓 프로그램의 "Hello World"라고 볼 수 있다. 아직 통신은 하지 않고, Winsock을 초기화하고 정리하는 것만 하는 것이다.
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
// Winsock 2.2 버전으로 초기화 요청
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0)
{
std::cout << "WSAStartup failed: " << result << std::endl;
return 1;
}
std::cout << "Winsock init success!" << std::endl;
std::cout << "Version: "
<< (int)LOBYTE(wsaData.wVersion) << "."
<< (int)HIBYTE(wsaData.wVersion) << std::endl;
// 사용 끝나면 반드시 정리
WSACleanup();
return 0;
}
코드를 한 줄씩 보자면 다음과 같다.
#include <winsock2.h>: Winsock의 최신(2.x) 헤더로, 옛날winsock.h가 아니라 반드시winsock2.h를 써야 한다.WSADATA wsaData;: 초기화 결과(버전 정보 등)를 담을 구조체WSAStartup(MAKEWORD(2, 2), &wsaData): Winsock 라이브러리를 메모리에 적재하고 사용할 준비를 한다.WSACleanup(): 다 쓰고 나면 자원을 반납한다. WSAStartup과 짝꿍이라 항상 같이 다닌다고 보면 된다.
실행은 Ctrl + F5로, 다음과 같은 화면이 뜨면 실행 성공이다! 아직 아무것도 주고받지 않았지만, 소켓을 만들 준비가 끝난 상태다. 번거로운 과정처럼 보여도 이 준비 자체가 소켓이 내 것이 아니라 OS의 것임을 계속 상기시켜 준다.

'프로그래밍 언어 > C++' 카테고리의 다른 글
| [소켓 통신] 멀티스레드 구현 (0) | 2026.07.14 |
|---|---|
| [소켓 통신] 메시지 주고받기 (0) | 2026.07.13 |
| [소켓 통신] 서버에서 클라이언트 접속 받기 (0) | 2026.07.10 |
| 불안정 정렬과 안정 정렬 (Stable Sort) (1) | 2024.08.30 |
| map과 unordered_map 비교 (2) | 2024.07.22 |
