์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹œ์ž‘: ์ฃผ์†Œ ์ฒด๊ณ„๋ถ€ํ„ฐ closesocket๊นŒ์ง€ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

2025. 4. 11. 17:52ใ†Development๐Ÿ‘ฉ๐Ÿป‍๐Ÿฆณ/Communication

๋‹จ์ˆœํ•œ ๋™์ž‘ ์ดํ•ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ๋ฆ„, ์ „์—ญ ๋ณ€์ˆ˜ ํ™œ์šฉ, Winsock ํ™•์žฅ ํ•จ์ˆ˜ ์ ์šฉ๋ฒ•๊นŒ์ง€ ์‹ค๋ฌด์ ์ธ ์ธก๋ฉด์„ ๊ณ ๋ คํ•ด ์ •๋ฆฌํ–ˆ๋‹ค.


โœ… ์—ฐ์Šต๋ฌธ์ œ 05-B: ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ


๐Ÿ”ง ์š”๊ตฌ ์‚ฌํ•ญ ์š”์•ฝ

  • f(int x) ํ•จ์ˆ˜๋Š” x๊ฐ€ ์Œ์ˆ˜๋ฉด ์‹คํŒจ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ฑ๊ณต
  • ์‹คํŒจ ์‹œ errno ์ „์—ญ ๋ณ€์ˆ˜์— EINVAL ์„ค์ •
  • ๋ฆฌํ„ด ๊ฐ’์€ ์„ฑ๊ณต ์‹œ 0, ์‹คํŒจ ์‹œ 1

๐Ÿ“Œ ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์‹œ

c
๋ณต์‚ฌํŽธ์ง‘
#include <stdio.h>
#include <errno.h>  // errno, EINVAL
#include <stdlib.h> // exit()

void err_quit(const char* msg) {
    perror(msg);
    exit(1);
}

int f(int x) {
    if (x >= 0) {
        errno = 0;
        return 0;
    } else {
        errno = EINVAL;  // Invalid argument
        return -1;
    }
}

int main() {
    int retval = f(-100);  // ์‹คํŒจ ์‹œ๋„

    if (retval < 0)
        err_quit("f()");
    return 0;
}

๐Ÿ’ก ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

plaintext
๋ณต์‚ฌํŽธ์ง‘
f(): Invalid argument

errno๋Š” C ํ‘œ์ค€์˜ ์ „์—ญ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ณ€์ˆ˜์ด๋ฉฐ, ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์˜ค๋ฅ˜ ์™ธ์—๋„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

 


โœ… ์—ฐ์Šต๋ฌธ์ œ 06: WSASocket()์œผ๋กœ TCP / UDP ์†Œ์ผ“ ์ƒ์„ฑ


๐Ÿ“Œ ๊ฐœ์š”

**WSASocket()**์€ **socket()**๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ™•์žฅ ์˜ต์…˜, ์˜ค๋ฒ„๋žฉ IO, ํ”Œ๋ž˜๊ทธ ์ง€์ •์ด ๊ฐ€๋Šฅํ•œ Winsock ๊ณ ๊ธ‰ ํ•จ์ˆ˜๋‹ค.


๐Ÿ”ง ๊ธฐ๋ณธ ์‚ฌ์šฉ ํ˜•์‹

c
๋ณต์‚ฌํŽธ์ง‘
SOCKET WSASocket(
  int af,            // ์ฃผ์†Œ ์ฒด๊ณ„ (์˜ˆ: AF_INET)
  int type,          // ์†Œ์ผ“ ํƒ€์ž… (์˜ˆ: SOCK_STREAM)
  int protocol,      // ํ”„๋กœํ† ์ฝœ (์˜ˆ: IPPROTO_TCP)
  LPWSAPROTOCOL_INFO lpProtocolInfo,
  GROUP g,
  DWORD dwFlags      // ์˜ต์…˜ ํ”Œ๋ž˜๊ทธ
);


๐Ÿ“Œ TCP/UDP ์†Œ์ผ“ ์ƒ์„ฑ ์˜ˆ์ œ ์ฝ”๋“œ

c
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32")

void err_quit(const char* msg) {
    fprintf(stderr, "[์˜ค๋ฅ˜] %s: %d\\n", msg, WSAGetLastError());
    exit(1);
}

int main() {
    WSADATA wsa;
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        err_quit("WSAStartup()");

    // TCP ์†Œ์ผ“
    SOCKET tcp_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
    if (tcp_sock == INVALID_SOCKET)
        err_quit("WSASocket() - TCP");

    // UDP ์†Œ์ผ“
    SOCKET udp_sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
    if (udp_sock == INVALID_SOCKET)
        err_quit("WSASocket() - UDP");

    printf("TCP ์†Œ์ผ“: %d\\n", (int)tcp_sock);
    printf("UDP ์†Œ์ผ“: %d\\n", (int)udp_sock);

    closesocket(tcp_sock);
    closesocket(udp_sock);
    WSACleanup();
    return 0;
}


โœ… ํ•ต์‹ฌ ์ฐจ์ด์  ์š”์•ฝ: socket() vs WSASocket()

ํ•ญ๋ชฉ socket() WSASocket()

๊ธฐ๋ณธ ์šฉ๋„ ๋‹จ์ˆœ ์†Œ์ผ“ ์ƒ์„ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์„ค์ •์ด ํ•„์š”ํ•œ ์†Œ์ผ“ ์ƒ์„ฑ
ํ™•์žฅ ์˜ต์…˜ ๋ถˆ๊ฐ€ dwFlags ํ”Œ๋ž˜๊ทธ๋กœ ์„ค์ • ๊ฐ€๋Šฅ (์˜ˆ: ์˜ค๋ฒ„๋žฉ)
ํ™œ์šฉ ์ƒํ™ฉ ๋‹จ์ˆœ ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„, Overlapped I/O, QoS ๋“ฑ ํ•„์š”์‹œ

์ด ์„น์…˜์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋ฐ˜ ์ค‘ ํ•˜๋‚˜์ธ "์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ(Error Handling)" ๊ฐœ๋…์„ ๋‹ค๋ฃฌ๋‹ค. ํŠนํžˆ ์†Œ์ผ“ ํ•จ์ˆ˜์˜ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๋งŒํผ, ์œˆ๋„์šฐ/๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ •ํ™•ํžˆ ํƒ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ๋กœ์ง์€ ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.


โœ… Chapter 02 - 01: ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ•ต์‹ฌ ์ •๋ฆฌ


๐Ÿ“Œ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

  • ๋„คํŠธ์›Œํฌ๋Š” ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ์˜์กด (์ผ€์ด๋ธ”, ๋ผ์šฐํ„ฐ, ํฌํŠธ, ๋ฐฉํ™”๋ฒฝ ๋“ฑ)
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ฃผ์š” ์†Œ์ผ“ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์˜ค๋ฅ˜ ์ฒดํฌ ํ•„์š”
  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ, ์ฝ”๋“œ๋กœ๋Š” ์›์ธ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ → ์‚ฌ์šฉ์ž๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ถœ๋ ฅ ํ•„์š”

โœ… ์†Œ์ผ“ ํ•จ์ˆ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์œ ํ˜• (3๊ฐ€์ง€)

์œ ํ˜• ๋ฒˆํ˜ธ ์„ค๋ช… ์˜ˆ์‹œ

โ‘  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ•„์š” ์—†์Œ ๋ฆฌํ„ด๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ ์—†์Œ closesocket() ๋“ฑ ์ผ๋ถ€ ํ•จ์ˆ˜
โ‘ก ๋ฆฌํ„ด๊ฐ’ ์ž์ฒด๊ฐ€ ์˜ค๋ฅ˜ ์ •๋ณด ํฌํ•จ ์‹คํŒจ ์‹œ 0 ๋˜๋Š” ์Œ์ˆ˜ ๋“ฑ์œผ๋กœ ๋ฆฌํ„ด WSAStartup()
โ‘ข ๋ฆฌํ„ด๊ฐ’๊ณผ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ถ„๋ฆฌ ์‹คํŒจ ํ™•์ธ ํ›„ ์˜ค๋ฅ˜ ์ฝ”๋“œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€๋ถ€๋ถ„์˜ ์†Œ์ผ“ ํ•จ์ˆ˜ (socket()bind() ๋“ฑ)

์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ โ‘ข๋ฒˆ, ์ฆ‰ "๋ฆฌํ„ด๊ฐ’ ํ™•์ธ ํ›„ → ์˜ค๋ฅ˜ ์ฝ”๋“œ ํ•จ์ˆ˜ ํ˜ธ์ถœ"์ด๋‹ค.


โœ… 1. ์œˆ๋„์šฐ ์†Œ์ผ“ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹


๐Ÿ“Œ ๋Œ€ํ‘œ ํ•จ์ˆ˜: WSAGetLastError()

  • ๋Œ€๋ถ€๋ถ„์˜ ์†Œ์ผ“ ํ•จ์ˆ˜๋Š” ์‹คํŒจ ์‹œ INVALID_SOCKET, SOCKET_ERROR ๋“ฑ์˜ ๊ฐ’์„ ๋ฆฌํ„ด
  • ๊ตฌ์ฒด์ ์ธ ์˜ค๋ฅ˜๋Š” **WSAGetLastError()**๋ฅผ ํ†ตํ•ด ํ™•์ธ
cpp
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32")

int main() {
    WSADATA wsa;
    int result = WSAStartup(MAKEWORD(2, 2), &wsa);

    if (result != 0) {
        printf("WSAStartup ์‹คํŒจ: ์ฝ”๋“œ %d\\n", result);
        return 1;
    }

    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
        int errCode = WSAGetLastError();
        printf("์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ: ์ฝ”๋“œ %d\\n", errCode);
    }

    WSACleanup();
    return 0;
}


๐Ÿ“Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ•จ์ˆ˜ (์„ ํƒ ์ ์šฉ)

์œˆ๋„์šฐ์—์„œ๋Š” ์˜ค๋ฅ˜ ์ฝ”๋“œ์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด **FormatMessage()**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ:

cpp
๋ณต์‚ฌํŽธ์ง‘
#include <windows.h>

void print_error_message(DWORD errCode) {
    LPVOID msg;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, errCode, 0, (LPTSTR)&msg, 0, NULL);
    printf("์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: %s\\n", (char*)msg);
    LocalFree(msg);
}


โœ… ์š”์•ฝ ํ๋ฆ„

plaintext
๋ณต์‚ฌํŽธ์ง‘
[์†Œ์ผ“ ํ•จ์ˆ˜ ํ˜ธ์ถœ]
    ↓
[๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‹คํŒจ ์—ฌ๋ถ€ ํ™•์ธ]
    ↓
[WSAGetLastError() ํ˜ธ์ถœ]
    ↓
[์˜ค๋ฅ˜ ์ฝ”๋“œ ์ถœ๋ ฅ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ๋ณ€ํ™˜]


๐Ÿ“Œ ์˜ค๋ฅ˜ ์ฝ”๋“œ ์˜ˆ์‹œ

์ฝ”๋“œ ์˜๋ฏธ

10013 ๊ถŒํ•œ ์—†์Œ (Access denied)
10048 ์ฃผ์†Œ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘ (Address already in use)
10061 ๋Œ€์ƒ ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€ (Connection refused)
10060 ์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ (Connection timed out)

์ „์ฒด ์ฝ”๋“œ ๋ชฉ๋ก์€ MSDN์ด๋‚˜ WinError.h์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ


์•„๋ž˜๋Š” Chapter 02์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ์š”์•ฝ๋ณธ์ด๋‹ค. ํ•ต์‹ฌ ํ•จ์ˆ˜์™€ ๊ฐœ๋…์„ ํ”Œ๋žซํผ ๋ณ„ ์ฐจ์ด์™€ ํ•จ๊ป˜ ๊ตฌ์กฐ์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋‘์—ˆ์œผ๋‹ˆ, ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์‹ค์ „ ์ ์šฉ์„ ์œ„ํ•œ ๋น ๋ฅธ ์ฐธ์กฐ์šฉ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.


โœ… Chapter 02 ์š”์•ฝ: ์†Œ์ผ“ ์‹œ์ž‘ํ•˜๊ธฐ


โœ… 01. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

ํ•ญ๋ชฉ Windows Linux / POSIX

์˜ค๋ฅ˜ ์ฝ”๋“œ ์–ป๊ธฐ WSAGetLastError() ์ „์—ญ ๋ณ€์ˆ˜ errno
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์–ป๊ธฐ FormatMessage() strerror(errno) ๋˜๋Š” perror()

๋ชจ๋“  ์ฃผ์š” ์†Œ์ผ“ ํ•จ์ˆ˜ (socket(), bind(), connect() ๋“ฑ)๋Š” ์‹คํŒจ ์‹œ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ฐ˜ํ™˜ ํ•„์š”

 


โœ… 02. ์œˆ์† ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ (Windows ํ•œ์ •)

ํ•จ์ˆ˜ ์„ค๋ช…

WSAStartup() ์†Œ์ผ“ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ดˆ๊ธฐํ™” (Winsock 2.x ์‚ฌ์šฉ)
WSACleanup() ์†Œ์ผ“ ์‚ฌ์šฉ ์ข…๋ฃŒ, ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜

โœ… WSAStartup()์€ ๋ฐ˜๋“œ์‹œ closesocket() ํ›„ WSACleanup()์œผ๋กœ ์ •๋ฆฌํ•ด์•ผ ํ•จ

 


โœ… 03. ์†Œ์ผ“ ์ƒ์„ฑ

ํ•จ์ˆ˜ ์„ค๋ช…

socket() ํ†ต์‹ ์šฉ ์†Œ์ผ“ ์ƒ์„ฑ, ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ธ๋“ค(SOCKET) ๋ฆฌํ„ด

๐Ÿ“Œ TCP/UDP ์„ค์ • ์กฐํ•ฉ ์˜ˆ์‹œ

ํ”„๋กœํ† ์ฝœ ์ฃผ์†Œ ์ฒด๊ณ„ (af) ์†Œ์ผ“ ํƒ€์ž… (type) ํ”„๋กœํ† ์ฝœ (protocol)

TCP AF_INETAF_INET6 SOCK_STREAM 0
UDP AF_INETAF_INET6 SOCK_DGRAM 0

protocol = 0์ด๋ฉด type์— ๋”ฐ๋ผ ์ž๋™ ์ง€์ • (TCP: IPPROTO_TCP, UDP: IPPROTO_UDP)


โœ… 04. ์†Œ์ผ“ ๋‹ซ๊ธฐ

ํ”Œ๋žซํผ ํ•จ์ˆ˜ ๋ช… ์„ค๋ช…

Windows closesocket() ์†Œ์ผ“ ์ข…๋ฃŒ ๋ฐ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
Linux/Unix close() ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฐฉ์‹ ์†Œ์ผ“ ์ข…๋ฃŒ

 


โœ… ์‹ค๋ฌด ์š”์•ฝ ํ๋ฆ„ (Windows ๊ธฐ์ค€)

plaintext
๋ณต์‚ฌํŽธ์ง‘
[WSAStartup()]  →  [socket()]  →  [์‚ฌ์šฉ]  →  [closesocket()]  →  [WSACleanup()]

Linux๋Š” WSAStartup() / WSACleanup() ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ socket() ~ close() ์‚ฌ์šฉ


๐Ÿ”š ์ถ”๊ฐ€ ์š”์•ฝ ๋ฉ”๋ชจ

  • socket() ๋ฆฌํ„ด๊ฐ’์€ ์‹คํŒจ ์‹œ INVALID_SOCKET (Windows) / 1 (Linux)
  • ๋ฆฌํ„ด๊ฐ’ ํ™•์ธ ํ›„ ์ฆ‰์‹œ ์˜ค๋ฅ˜ ์ฝ”๋“œ ์ถ”์ ํ•˜๋Š” ์Šต๊ด€ ์ค‘์š”
  • ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ์‚ฌ์šฉ ํ›„ ๋ฐ˜๋“œ์‹œ ํ•ด์ œ (closesocket() ๋˜๋Š” close())

์ข‹์•„, ์•„๋ž˜๋Š” ์—ฐ์Šต๋ฌธ์ œ 01~05-A๊นŒ์ง€์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ํ•ด์„ → ์ฝ”๋“œ ์˜ˆ์ œ → ๊ฒฐ๊ณผ ํ•ด์„ค ํ๋ฆ„์œผ๋กœ ์ •๋ฆฌํ•œ ์™„์„ฑ๋„ ๋†’์€ ํ•ด์„ค์ด๋‹ค. Windows ํ™˜๊ฒฝ์—์„œ์˜ Winsock ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‘์šฉ๊นŒ์ง€ ์ฒด๊ณ„์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์œผ๋ฉฐ, InitSocket ์˜ˆ์ œ ์ˆ˜์ •๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ–ˆ๋‹ค.


โœ… ์—ฐ์Šต๋ฌธ์ œ 01: wsa ๋ณ€์ˆ˜์˜ ์ฃผ์š” ํ•„๋“œ ์ถœ๋ ฅ


๐Ÿ”ง ์š”๊ตฌ ์‚ฌํ•ญ

  • WSADATA ๊ตฌ์กฐ์ฒด์˜ ๋‹ค์Œ 4๊ฐœ ํ•„๋“œ๋ฅผ ์ถœ๋ ฅ
  • wVersionwHighVersionszDescriptionszSystemStatus
  • Winsock 1.1 ๋ฒ„์ „ ์š”์ฒญ(MAKEWORD(1,1)) ์‹œ ๊ฐ’ ๋น„๊ต

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

cpp
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32")

int main() {
    WSADATA wsa;
    int result = WSAStartup(MAKEWORD(1, 1), &wsa);
    if (result != 0) {
        printf("WSAStartup ์‹คํŒจ: %d\\n", result);
        return 1;
    }

    printf("wVersion: %x\\n", wsa.wVersion);
    printf("wHighVersion: %x\\n", wsa.wHighVersion);
    printf("szDescription: %s\\n", wsa.szDescription);
    printf("szSystemStatus: %s\\n", wsa.szSystemStatus);

    WSACleanup();
    return 0;
}

๐Ÿ’ก ๊ฒฐ๊ณผ ์˜ˆ์‹œ (๋ฒ„์ „ 1.1 ์š”์ฒญ ์‹œ)

plaintext
๋ณต์‚ฌํŽธ์ง‘
wVersion: 101
wHighVersion: 202
szDescription: WinSock 2.0
szSystemStatus: Running

 

โœ… wVersion์€ ์š”์ฒญ๋œ ๋ฒ„์ „, wHighVersion์€ ์ง€์› ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ฒ„์ „


โœ… ์—ฐ์Šต๋ฌธ์ œ 02-A / 02-B: UDP ์†Œ์ผ“ ์ƒ์„ฑ


๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ (IPv4 ๊ธฐ๋ฐ˜ UDP)

cpp
๋ณต์‚ฌํŽธ์ง‘
SOCKET udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_sock == INVALID_SOCKET)
    err_quit("UDP ์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");

โœ… SOCK_DGRAM, protocol = 0 → UDP


โœ… ์—ฐ์Šต๋ฌธ์ œ 03-A / 03-B: IPv6 ๊ธฐ๋ฐ˜ TCP ์†Œ์ผ“ ์ƒ์„ฑ


๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

cpp
๋ณต์‚ฌํŽธ์ง‘
SOCKET tcp6_sock = socket(AF_INET6, SOCK_STREAM, 0);
if (tcp6_sock == INVALID_SOCKET)
    err_quit("IPv6 TCP ์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");

โœ… AF_INET6์œผ๋กœ ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ IPv6๋กœ ์„ค์ •


โœ… ์—ฐ์Šต๋ฌธ์ œ 04-A / 04-B: IPv6 ๊ธฐ๋ฐ˜ UDP ์†Œ์ผ“ ์ƒ์„ฑ


๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

cpp
๋ณต์‚ฌํŽธ์ง‘
SOCKET udp6_sock = socket(AF_INET6, SOCK_DGRAM, 0);
if (udp6_sock == INVALID_SOCKET)
    err_quit("IPv6 UDP ์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");


โœ… ์—ฐ์Šต๋ฌธ์ œ 05-A: ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ (WSASetLastError ์‚ฌ์šฉ)


๐Ÿ”ง ์š”๊ตฌ ์‚ฌํ•ญ

  • ์ž…๋ ฅ๊ฐ’์ด ์Œ์ˆ˜๋ฉด SOCKET_ERROR ๋ฐ˜ํ™˜, **WSASetLastError()**๋กœ ์˜ค๋ฅ˜ ์ฝ”๋“œ ์ง€์ •
  • ์„ฑ๊ณต์ด๋ฉด 0, ์˜ค๋ฅ˜์ฝ”๋“œ๋Š” 0

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

cpp
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32")

void err_quit(const char* msg) {
    fprintf(stderr, "[์˜ค๋ฅ˜] %s: %d\\n", msg, WSAGetLastError());
    exit(1);
}

int f(int x) {
    if (x >= 0) {
        WSASetLastError(0);
        return 0;
    } else {
        WSASetLastError(WSAEINVAL);  // Invalid argument
        return SOCKET_ERROR;
    }
}

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

    int retval = f(-100);
    if (retval == SOCKET_ERROR)
        err_quit("f()");

    WSACleanup();
    return 0;
}

๐Ÿ’ก ์ถœ๋ ฅ ์˜ˆ์‹œ

plaintext
๋ณต์‚ฌํŽธ์ง‘
[์˜ค๋ฅ˜] f(): 10022

โœ… 10022๋Š” WSAEINVAL์— ํ•ด๋‹นํ•˜๋Š” ์˜ค๋ฅ˜ ์ฝ”๋“œ (Invalid argument)


๐Ÿ”š ์ „์ฒด ์š”์•ฝ

๋ฌธ์ œ ์ฃผ์š” ํฌ์ธํŠธ

01 WSADATA ํ•„๋“œ ํ•ด์„ ๋ฐ ๋ฒ„์ „ ๋ณ€ํ™” ๊ด€์ฐฐ
02 UDP ์†Œ์ผ“ ์ƒ์„ฑ: SOCK_DGRAMAF_INET
03 IPv6 TCP ์†Œ์ผ“ ์ƒ์„ฑ: AF_INET6SOCK_STREAM
04 IPv6 UDP ์†Œ์ผ“ ์ƒ์„ฑ: AF_INET6SOCK_DGRAM
05 ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜: WSASetLastError() ํ™œ์šฉ

์ข‹์•„, ์—ฌ๊ธฐ์„œ๋Š” ์‹ค์Šต 2-2์˜ ํ•ต์‹ฌ์ธ ์†Œ์ผ“ ์ƒ์„ฑ๊ณผ ๋‹ซ๊ธฐ (์œˆ๋„์šฐ vs ๋ฆฌ๋ˆ…์Šค) ๋ฅผ ์‹ค์Šต ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๊ณ , ์‹ค์ œ ์ฝ”๋“œ ์„ค๋ช…๊นŒ์ง€ ์ •๋ฆฌํ•ด์ค„๊ฒŒ. ๋ชฉ์ ์€ ์†Œ์ผ“์„ ๋งŒ๋“ค๊ณ  → ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  → ๋‹ซ๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋ฃจํ‹ด์„ ์ฒด๋“ํ•˜๋Š” ๊ฒƒ์ด์•ผ.

โœ… ์‹ค์Šต 2-2: ์†Œ์ผ“ ์ƒ์„ฑ๊ณผ ๋‹ซ๊ธฐ


๐Ÿ–ฅ๏ธ Windows ํ™˜๊ฒฝ: InitSocket.cpp

cpp
๋ณต์‚ฌํŽธ์ง‘
#include "..\\..\\Common.h"

int main(int argc, char* argv[]) {
    // 1. ์œˆ์† ์ดˆ๊ธฐํ™”
    WSADATA wsa;
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        return 1;
    printf("[์•Œ๋ฆผ] ์œˆ์† ์ดˆ๊ธฐํ™” ์„ฑ๊ณต\\n");

    // 2. ์†Œ์ผ“ ์ƒ์„ฑ (IPv4, TCP)
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET)
        err_quit("socket()");
    printf("[์•Œ๋ฆผ] ์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต\\n");

    // 3. ์†Œ์ผ“ ๋‹ซ๊ธฐ
    closesocket(sock);

    // 4. ์œˆ์† ์ข…๋ฃŒ
    WSACleanup();

    return 0;
}

๐Ÿ” ํฌ์ธํŠธ ์š”์•ฝ

๋‹จ๊ณ„ ํ•จ์ˆ˜ ์„ค๋ช…

1 WSAStartup() Winsock ์ดˆ๊ธฐํ™” (ํ•„์ˆ˜)
2 socket() ์†Œ์ผ“ ์ƒ์„ฑ (IPv4 + TCP)
3 closesocket() ์†Œ์ผ“ ์ž์› ๋ฐ˜ํ™˜
4 WSACleanup() Winsock ์ข…๋ฃŒ ๋ฐ ์ •๋ฆฌ

err_quit() ํ•จ์ˆ˜๋Š” Common.h์— ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ ์ถœ๋ ฅ ํ•จ์ˆ˜. WSAGetLastError()๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•จ.


๐Ÿง Linux ํ™˜๊ฒฝ: InitSocket.cpp

cpp
๋ณต์‚ฌํŽธ์ง‘
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>     // close()
#include <sys/socket.h> // socket()
#include <netinet/in.h> // AF_INET

int main(int argc, char* argv[]) {
    // 1. ์†Œ์ผ“ ์ƒ์„ฑ (IPv4, TCP)
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("socket()");
        exit(1);
    }
    printf("[์•Œ๋ฆผ] ์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต\\n");

    // 2. ์†Œ์ผ“ ๋‹ซ๊ธฐ
    close(sock);

    return 0;
}

๐Ÿ” Linux ํฌ์ธํŠธ ์ฐจ์ด

ํ•ญ๋ชฉ ์œˆ๋„์šฐ ๋ฆฌ๋ˆ…์Šค

์ดˆ๊ธฐํ™” WSAStartup() ํ•„์š” ์—†์Œ
์ข…๋ฃŒ WSACleanup() ํ•„์š” ์—†์Œ
์†Œ์ผ“ ํƒ€์ž… SOCKET (typedef) int
๋‹ซ๊ธฐ ํ•จ์ˆ˜ closesocket() close()
์˜ค๋ฅ˜ ์ฝ”๋“œ WSAGetLastError() errno + perror()

๐Ÿ”Ž ์ฝ˜์†” ๊ฒฐ๊ณผ ์˜ˆ์‹œ

plaintext
๋ณต์‚ฌํŽธ์ง‘
[์•Œ๋ฆผ] ์œˆ์† ์ดˆ๊ธฐํ™” ์„ฑ๊ณต
[์•Œ๋ฆผ] ์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต
→ ์„ฑ๊ณต ํ›„ ์ข…๋ฃŒ

๋˜๋Š” Linux์—์„œ:

bash
๋ณต์‚ฌํŽธ์ง‘
$ ./InitSocket
[์•Œ๋ฆผ] ์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต


โœ… ์š”์•ฝ ํ๋ฆ„

plaintext
๋ณต์‚ฌํŽธ์ง‘
[์†Œ์ผ“ ์ƒ์„ฑ]
 ↓
[์—๋Ÿฌ ํ™•์ธ]
 ↓
[์ •์ƒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ]
 ↓
[์ž์› ์ •๋ฆฌ (close)]


๐Ÿ“Œ ์‹ค์Šต ์—ฐ์žฅ ์•„์ด๋””์–ด

  • AF_INET6 ๊ธฐ๋ฐ˜์œผ๋กœ ์†Œ์ผ“ ์ƒ์„ฑ ์‹œ๋„ํ•ด๋ณด๊ธฐ
  • **SOCK_DGRAM**์œผ๋กœ UDP ์†Œ์ผ“ ์‹ค์Šต
  • ์‹คํŒจ ์‹œ ์˜ค๋ฅ˜ ์ฝ”๋“œ ์ถœ๋ ฅ ๋ฐ ๋ฉ”์‹œ์ง€ํ™” ์—ฐ์Šต

์ด ์ ˆ์—์„œ๋Š” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ "์ฃผ์†Œ ์ฒด๊ณ„(Address Family)"์™€ "์†Œ์ผ“ ํƒ€์ž…(Socket Type)"์˜ ๊ฐœ๋…๊ณผ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. ์‹ค๋ฌด์ ์œผ๋กœ๋Š” socket() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ธฐ์ดˆ์ด์ž ํ•ต์‹ฌ์ด๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ์š”์•ฝ๊ณผ ๋„์‹ ์ค‘์‹ฌ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•ด ์ค„๊ฒŒ.

โœ… ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์ฃผ์†Œ ์ฒด๊ณ„์™€ ์†Œ์ผ“ ํƒ€์ž…


๐Ÿ“Œ 1. ์ฃผ์†Œ ์ฒด๊ณ„ (Address Family)

๊ฐœ๋…:

  • ํ†ต์‹  ๋Œ€์ƒ์˜ ์ฃผ์†Œ ํ˜•์‹์„ ์ •์˜
  • ์–ด๋–ค ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ(IP, Bluetooth ๋“ฑ)์„ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์„ ํƒํ•จ

๋Œ€ํ‘œ ์ฃผ์†Œ ์ฒด๊ณ„ ๊ฐ’

์‚ฌ์šฉ ๋ชฉ์  ์ƒ์ˆซ๊ฐ’ ์„ค๋ช…

IPv4 ํ†ต์‹  AF_INET IPv4 ์ฃผ์†Œ ์‚ฌ์šฉ (์˜ˆ: 192.168.0.1)
IPv6 ํ†ต์‹  AF_INET6 IPv6 ์ฃผ์†Œ ์‚ฌ์šฉ (์˜ˆ: 2001:abcd::1)
Bluetooth ํ†ต์‹  AF_BTH ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์šฉ
Unix Domain Socket AF_UNIX ๋กœ์ปฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  (๋ฆฌ๋ˆ…์Šค ์ „์šฉ)

โœ… socket() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์‚ฌ์šฉ๋จ


๐Ÿ“Œ 2. ์†Œ์ผ“ ํƒ€์ž… (Socket Type)

๊ฐœ๋…:

  • ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹ ๋ฐ ์‹ ๋ขฐ์„ฑ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
  • TCP/UDP ๋˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ „์†ก ํŠน์„ฑ์„ ์ •์˜

๋Œ€ํ‘œ ์†Œ์ผ“ ํƒ€์ž… ๊ฐ’

์†Œ์ผ“ ํƒ€์ž… ํŠน์„ฑ ์„ค๋ช…

SOCK_STREAM ์—ฐ๊ฒฐํ˜•, ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ (ex. TCP)
SOCK_DGRAM ๋น„์—ฐ๊ฒฐํ˜•, ์‹ ๋ขฐ์„ฑ ์—†์Œ (ex. UDP)

โœ… socket() ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์‚ฌ์šฉ๋จ


๐Ÿงญ ์ข…ํ•ฉ ์„ค์ • ๊ฐ€์ด๋“œ: TCP vs UDP

์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ์ฃผ์†Œ ์ฒด๊ณ„ (af) ์†Œ์ผ“ ํƒ€์ž… (type)

TCP (IPv4/6) AF_INET ๋˜๋Š” AF_INET6 SOCK_STREAM
UDP (IPv4/6) AF_INET ๋˜๋Š” AF_INET6 SOCK_DGRAM

ํ”„๋กœํ† ์ฝœ ๋ฒˆํ˜ธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 0์„ ์ž…๋ ฅํ•˜๋ฉด type์— ๋งž์ถฐ ์ž๋™์œผ๋กœ ์„ค์ •๋จ


๐Ÿ“Œ ์‹ค๋ฌด ๋ฉ”๋ชจ: ํƒ€์ž… ํ˜ธํ™˜์„ฑ๊ณผ SOCKET ์ •์˜

  • Windows:
    • **SOCKET**์€ ์ •์˜๋œ ์ž๋ฃŒํ˜• (unsigned int ๋“ฑ) → closesocket() ์‚ฌ์šฉ
  • Linux:
    • **socket()**์€ int ํƒ€์ž…์„ ๋ฐ˜ํ™˜ → close() ์‚ฌ์šฉ
  • ํ˜ธํ™˜์„ฑ ํ™•๋ณด ๋ฐฉ๋ฒ•:
  • cpp ๋ณต์‚ฌํŽธ์ง‘ // Linux์—์„œ Windows ์ฝ”๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งคํ•‘ typedef int SOCKET
    ๊ฒฐ๋ก  ์š”์•ฝ

 

plaintext
๋ณต์‚ฌํŽธ์ง‘
[1๋‹จ๊ณ„] ์ฃผ์†Œ ์ฒด๊ณ„ ์„ ํƒ (IPv4 vs IPv6 ๋“ฑ)
       ↓
[2๋‹จ๊ณ„] ์†Œ์ผ“ ํƒ€์ž… ์„ ํƒ (TCP vs UDP ๋“ฑ)
       ↓
[3๋‹จ๊ณ„] socket() ํ˜ธ์ถœ → SOCKET ํ•ธ๋“ค ๋ฐ˜ํ™˜

์ด ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์ด ๋˜๋Š” ์†Œ์ผ“ ์ƒ์„ฑ ๊ธฐ๋ณธ ๊ณต์‹์ด์•ผ.


์ด๋ฒˆ ์ ˆ์€ socket() ํ•จ์ˆ˜์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ํ”„๋กœํ† ์ฝœ ์ง€์ • ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์†Œ์ผ“์„ ์ข…๋ฃŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” closesocket() vs close() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด. ์‹ค๋ฌด์—์„œ๋„ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ํ˜ผ์šฉ ์ผ€์ด์Šค(AF vs PF)๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ๊ด€๋ จํ•ด์„œ๋„ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ˆ, ์‹ค์Šต ๊ด€์ ์œผ๋กœ ์žฌ์ •๋ฆฌํ•ด์ค„๊ฒŒ.


โœ… ์†Œ์ผ“ ์ƒ์„ฑ ์‹œ ํ”„๋กœํ† ์ฝœ ์„ค์ • + ์†Œ์ผ“ ๋‹ซ๊ธฐ


๐Ÿ“Œ 1. socket() ํ•จ์ˆ˜์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ž: ํ”„๋กœํ† ์ฝœ (Protocol)

๐Ÿ”ง ์—ญํ• 

  • ๋™์ผํ•œ ์ฃผ์†Œ ์ฒด๊ณ„(AF_)์™€ ์†Œ์ผ“ ํƒ€์ž…(SOCK_) ์กฐํ•ฉ์—์„œ ๋ช…ํ™•ํ•œ ํ”„๋กœํ† ์ฝœ ์„ ํƒ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

์˜ˆ์‹œ: socket() ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜

c
๋ณต์‚ฌํŽธ์ง‘
int socket(int domain, int type, int protocol);

[ํ‘œ 2-4] TCP์™€ UDP ์„ค์ •

์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ์ฃผ์†Œ ์ฒด๊ณ„ (domain) ์†Œ์ผ“ ํƒ€์ž… (type) ํ”„๋กœํ† ์ฝœ (protocol)

TCP AF_INETAF_INET6 SOCK_STREAM IPPROTO_TCP (or 0)
UDP AF_INETAF_INET6 SOCK_DGRAM IPPROTO_UDP (or 0)

โš ๏ธ ์‹ค๋ฌด์—์„œ๋Š” protocol ์ž๋ฆฌ์— ๋ณดํ†ต 0์„ ๋„ฃ์œผ๋ฉด, type์— ๋”ฐ๋ผ TCP/UDP๊ฐ€ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋จ

๐Ÿ“Œ ํ”„๋กœํ† ์ฝœ ๊ฐ’ ์ƒ์ˆ˜ ์š”์•ฝ

์ด๋ฆ„ ๊ฐ’ (๋ณดํ†ต) ์„ค๋ช…

IPPROTO_TCP 6 TCP ํ”„๋กœํ† ์ฝœ
IPPROTO_UDP 17 UDP ํ”„๋กœํ† ์ฝœ
0 ์ž๋™ ์ง€์ • type ๊ฐ’ ๊ธฐ์ค€ ์ž๋™ ์„ค์ •

๐Ÿ“Œ 2. AF_INET vs PF_INET

์‹ค์Šต ์ค‘ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…, ํ™•์‹คํžˆ ์ •๋ฆฌํ•ด๋ณด์ž.

๊ตฌ๋ถ„ ์˜๋ฏธ ์‹ค์ œ ๊ฐ’ ๋™์ผ ์‚ฌ์šฉ ์œ„์น˜ (๊ณผ๊ฑฐ ๊ธฐ์ค€)

AF_INET Address Family (์ฃผ์†Œ ์ฒด๊ณ„) โœ… ๊ฐ™์Œ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ (์˜ˆ: struct sockaddr_in)
PF_INET Protocol Family (ํ”„๋กœํ† ์ฝœ ๊ณ„์—ด) โœ… ๊ฐ™์Œ socket() ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ

โœ… ์ง€๊ธˆ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์„œ์™€ ์ฝ”๋“œ์—์„œ AF_ ๊ณ„์—ด๋กœ ํ†ต์ผํ•˜์—ฌ ์‚ฌ์šฉ


๐Ÿ“Œ 3. ์†Œ์ผ“ ๋‹ซ๊ธฐ (closesocket() vs close())

โœ… Windows

c
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
int closesocket(SOCKET s);  // ๋ฆฌํ„ด๊ฐ’: ์„ฑ๊ณต 0, ์‹คํŒจ SOCKET_ERROR

โœ… Linux

c
๋ณต์‚ฌํŽธ์ง‘
#include <unistd.h>
int close(int fd);          // ๋ฆฌํ„ด๊ฐ’: ์„ฑ๊ณต 0, ์‹คํŒจ -1

๐Ÿ” ์ฃผ์˜ํ•  ์ 

ํ•ญ๋ชฉ Windows Linux

์†Œ์ผ“ ํƒ€์ž… SOCKET int (ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ)
๋‹ซ๊ธฐ ํ•จ์ˆ˜ closesocket() close()
์˜ค๋ฅ˜ ํ™•์ธ WSAGetLastError() errno / perror()

โš ๏ธ close()๋กœ Winsock ์†Œ์ผ“์„ ์ข…๋ฃŒํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ํ•ด์ œ๊ฐ€ ๋ถˆ์™„์ „ํ•ด์งˆ ์ˆ˜ ์žˆ์Œ → Windows์—์„œ๋Š” closesocket() ํ•„์ˆ˜


๐Ÿงญ ์ข…ํ•ฉ ํ๋ฆ„: ์†Œ์ผ“ ์ƒ์„ฑ ~ ์ข…๋ฃŒ

c
๋ณต์‚ฌํŽธ์ง‘
// 1. ์†Œ์ผ“ ์ƒ์„ฑ (TCP ์˜ˆ์‹œ)
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // or 0

// 2. ํ†ต์‹  ์ž‘์—…

// 3. ์†Œ์ผ“ ์ข…๋ฃŒ
closesocket(sock);    // Windows
close(sock);          // Linux


๐Ÿ”š ์ •๋ฆฌ ๋ฉ”๋ชจ

๊ฐœ๋… ํ‚ค์›Œ๋“œ ์„ค๋ช…

์ฃผ์†Œ ์ฒด๊ณ„ AF_INETAF_INET6 IPv4/IPv6์šฉ ์ฃผ์†Œ ์ง€์ •
์†Œ์ผ“ ํƒ€์ž… SOCK_STREAMSOCK_DGRAM TCP/UDP ์ „์†ก ์œ ํ˜•
ํ”„๋กœํ† ์ฝœ IPPROTO_TCPIPPROTO_UDP0 ๋ช…์‹œ ๋˜๋Š” ์ž๋™ ์ง€์ •
์†Œ์ผ“ ์ข…๋ฃŒ closesocket() vs close() ํ”Œ๋žซํผ๋ณ„ ์ข…๋ฃŒ ๋ฐฉ์‹
AF vs PF ์‹ค์งˆ์  ์ฐจ์ด ์—†์Œ AF_INET ์‚ฌ์šฉ ๊ถŒ์žฅ

์ด๋ฒˆ ์ ˆ์€ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” socket() ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹, ์ฆ‰ ์†Œ์ผ“์˜ ์ƒ์„ฑ๊ณผ ๊ฐœ๋…์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์–ด. Windows์™€ Linux ๊ฐ„์˜ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ  socket() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ธ์ž — ์ฃผ์†Œ ์ฒด๊ณ„, ์†Œ์ผ“ ํƒ€์ž…, ํ”„๋กœํ† ์ฝœ — ์— ๋Œ€ํ•ด ์•„์ฃผ ์ค‘์š”ํ•˜๊ณ ๋„ ์‹ค์šฉ์ ์ธ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด.

์•„๋ž˜์— ๊ตฌ์กฐํ™”ํ•ด์„œ ํ•ต์‹ฌ ์š”์•ฝ๊ณผ ์‹ค์Šตํ˜• ์ฝ”๋“œ๊นŒ์ง€ ์ •๋ฆฌํ•ด์ค„๊ฒŒ.


โœ… Chapter 03: ์†Œ์ผ“ ์ƒ์„ฑ๊ณผ ๋‹ซ๊ธฐ – ํ•ต์‹ฌ ์š”์•ฝ


๐Ÿ“Œ 1. ์†Œ์ผ“ ์ƒ์„ฑ์ด๋ž€?

  • socket() ํ•จ์ˆ˜๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ํ•ธ๋“ค(=์†Œ์ผ“ ๋””์Šคํฌ๋ฆฝํ„ฐ) ์„ ์ƒ์„ฑ
  • ์ด ํ•ธ๋“ค์€ ๋„คํŠธ์›Œํฌ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์˜๋ฏธ
  • ์ƒ์„ฑ๋œ ์†Œ์ผ“ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ์ดํ›„ bind()connect()send()recv() ๋“ฑ์˜ ํ•จ์ˆ˜์— ์ „๋‹ฌ

๐Ÿงฉ socket() ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž… ๋น„๊ต

OS ํ•จ์ˆ˜ ์ •์˜ ์„ค๋ช…

Windows SOCKET socket(int af, int type, int protocol); **SOCKET**์€ ๋ณ„๋„ ์ •์˜๋œ ํƒ€์ž…
Linux int socket(int domain, int type, int protocol); **int**ํ˜• ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

โœ… ๋ฐ˜ํ™˜๊ฐ’์€ ๋‘˜ ๋‹ค ์†Œ์ผ“ ํ•ธ๋“ค๊ฐ’, ์‹คํŒจ ์‹œ INVALID_SOCKET (Windows) ๋˜๋Š” -1 (Linux)


๐Ÿงญ socket() ํ•จ์ˆ˜์˜ ์„ธ ๊ฐ€์ง€ ์ธ์ž

์ธ์ž ์ด๋ฆ„ ์„ค๋ช… ๋ฐ ์˜ˆ์‹œ ๊ฐ’

1 ์ฃผ์†Œ ์ฒด๊ณ„ AF_INETAF_INET6 (IPv4/6), AF_BLUETOOTHAF_UNIX
2 ์†Œ์ผ“ ํƒ€์ž… SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
3 ํ”„๋กœํ† ์ฝœ  

๐Ÿ’ป ์˜ˆ์ œ ์ฝ”๋“œ – Windows (TCP ์†Œ์ผ“ ์ƒ์„ฑ)

cpp
๋ณต์‚ฌํŽธ์ง‘
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32")

int main() {
    WSADATA wsa;
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        return 1;

    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); // TCP
    if (sock == INVALID_SOCKET) {
        printf("์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ\\n");
        WSACleanup();
        return 1;
    }

    printf("์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต: %d\\n", (int)sock);
    closesocket(sock);
    WSACleanup();
    return 0;
}


๐Ÿง ์˜ˆ์ œ ์ฝ”๋“œ – Linux (UDP ์†Œ์ผ“ ์ƒ์„ฑ)

c
๋ณต์‚ฌํŽธ์ง‘
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sock = socket(AF_INET, SOCK_DGRAM, 0); // UDP
    if (sock < 0) {
        perror("์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");
        exit(1);
    }

    printf("์†Œ์ผ“ ์ƒ์„ฑ ์„ฑ๊ณต: %d\\n", sock);
    close(sock);
    return 0;
}


๐Ÿ”š ์ •๋ฆฌ: ์†Œ์ผ“ ์ƒ์„ฑ ํ•ต์‹ฌ ํฌ์ธํŠธ

ํ•ญ๋ชฉ ๋‚ด์šฉ

ํ”Œ๋žซํผ ์ฐจ์ด Windows: WSAStartup() ํ•„์ˆ˜ / ๋ฆฌ๋ˆ…์Šค๋Š” ์—†์Œ
๋ฆฌํ„ด๊ฐ’ ์‹คํŒจ ์‹œ Windows: INVALID_SOCKET, Linux: -1
ํด๋กœ์ง• Windows: closesocket() / Linux: close()
์ผ๋ฐ˜ ์„ค์ • TCP: AF_INETSOCK_STREAM0 / UDP: AF_INETSOCK_DGRAM0