0Pricing
C++ Academy · 강의

C++의 BSD 소켓 API

C++ 프로그램에서 socket, bind, listen, accept, connect, send 및 recv를 사용합니다.

C++의 BSD 소켓 API은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

소켓 API란 무엇인가요?

BSD 소켓 API는 네트워크 프로그래밍의 사실상 표준입니다. Linux, macOS, BSD에서 사용할 수 있으며, Windows에서도 Winsock을 통해 약간의 조정만 하면 사용할 수 있습니다.

필수 헤더

플랫폼 헤더를 포함하고 POSIX 형식을 사용합니다.

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

소켓 생성

socket 호출은 파일 기술자를 반환합니다. 패밀리(IPv4), 유형(TCP 또는 UDP), 프로토콜(기본값은 0)을 전달합니다.

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    perror("socket");
    return 1;
}

주소 구조체

struct sockaddr_in은 IPv4 주소와 포트를 저장합니다. 함수에 전달할 때는 struct sockaddr*로 형변환합니다.

struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

바이트 순서: 호스트와 네트워크

네트워크 바이트 순서는 빅 엔디언입니다. 변환하려면 htons, htonl, ntohs, ntohl을 사용합니다.

클라이언트 연결

connect를 사용하여 TCP 연결을 시작합니다.

if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
    perror("connect");
    close(sock);
    return 1;
}

송신 및 수신

send와 recv는 바이트를 주고받습니다. 둘 다 요청한 양보다 적게 반환할 수 있으므로 항상 반복해야 합니다.

const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);

char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';

바인딩 및 수신 대기(서버)

서버는 주소에 바인딩하고 수신 대기한 다음 연결을 수락합니다.

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);

소켓 닫기

Unix에서는 close를, Windows에서는 closesocket을 호출합니다.

close(sock);

오류 처리

소켓 함수는 오류가 발생하면 -1을 반환하고 errno를 설정합니다. 모든 반환 값을 확인합니다.

RAII로 감싸기

그대로 둔 파일 기술자는 쉽게 누수될 수 있습니다. 소멸자에서 close를 호출하는 RAII 형식으로 감싸거나, 사용자 지정 삭제자와 함께 std::unique_ptr을 사용합니다.

struct SocketCloser {
    void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;

Windows의 차이점

Windows에서는 다음과 같이 합니다:

  • <winsock2.h>를 포함하고 ws2_32에 링크합니다
  • 사용하기 전에 WSAStartup을 호출합니다
  • close 대신 closesocket을 사용합니다
  • 소켓 형식은 SOCKET입니다(부호 없음)

빠른 확인

클라이언트에서 서버로 TCP 연결을 시작하는 함수 호출은 무엇인가요?

복습

BSD 소켓 API는 낮은 수준의 네트워크 기능을 제공합니다. 소켓을 생성하고 주소를 설정한 다음, 클라이언트에서는 연결하고 서버에서는 bind+listen+accept를 수행합니다. htons 계열 함수로 바이트 순서를 변환합니다. 누수를 방지하려면 기술자를 RAII로 감쌉니다.

자주 묻는 질문

“C++의 BSD 소켓 API” 강의는 무료인가요?

네 — “C++의 BSD 소켓 API” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“C++의 BSD 소켓 API”에서 뭘 배우나요?

C++ 프로그램에서 socket, bind, listen, accept, connect, send 및 recv를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“C++의 BSD 소켓 API” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. C++의 BSD 소켓 API
  2. TCP 에코 서버 만들기
  3. epoll과 kqueue를 활용한 비동기 IO
  4. 현대적인 비동기 IO에 Boost Asio 사용하기
← C++ Academy(으)로 돌아가기