C++/Win32

[Win32] Windows Socket 기초 - TCP 연습

powergirl 2025. 12. 27. 13:29
1. WinSock 초기화
WSAStartup(MAKEWORD(2, 2), &wsaData);

Windows 는 소켓을 라이브러리로 제공함

필수

 

2. 서버 소켓 생성
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);

AF_INET >> IPv4

SOCK_STREAM >> TCP

 

 

3. 서버 주소 설정
serverAddr.sin_port = htons(9000);

htons >> Host TO Network Short

네트워크는 Big Endian

 

 

4. bind / listen
bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
listen(listenSocket, SOMAXCONN);

 

 

5. accept
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrSize);

클라이언트 접속 전까지 무한 대기

>>

accept 는 TCP 연결 요청이 들어올 때까지 커널 레벨에서 대기 한다.

블로킹 함수.

 

 

recv
recv(clientSocket, (char*)&value, sizeof(int), 0);

recv 는 수신 버퍼에 데이터가 도착하는 순간 풀림

>>

recv 가 풀리는 조건

1. 커널 수신 버퍼에 데이터가 1바이트라도 도착

2. 상대방이 연결을 종료 (FIN 수신)

3. 에러 발생

 

 

sizeof(int)

>>

TCP 는 데이터 타입을 모름

몇 바이트를 읽어야 할지 서버가 알 방법이 없음

"4바이트 정수" 라는 명시적 약속

 

 

서버
// SB002_Server.cpp
#include <winsock2.h>
#include <stdio.h>

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

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN serverAddr = {};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(9000);
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
    listen(listenSocket, SOMAXCONN);

    printf("서버 시작\n");

    while (true)
    {
        printf("클라이언트 접속 대기...\n");

        SOCKADDR_IN clientAddr = {};
        int addrSize = sizeof(clientAddr);
        SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrSize);

        printf("클라이언트 접속됨\n");

        int value = 0;
        recv(clientSocket, (char*)&value, sizeof(int), 0);

        printf("수신 값: %d\n", value);

        closesocket(clientSocket);
    }

    closesocket(listenSocket);
    WSACleanup();
    return 0;
}
클라
// SB001_Client.cpp
#include <winsock2.h>
#include <stdio.h>

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

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN serverAddr = {};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(9000);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr));

    int value = 1234;
    send(sock, (char*)&value, sizeof(int), 0);

    closesocket(sock);
    WSACleanup();

    return 0;
}