0Pricing
C Academy · 강의

TCP 서버

연결을 수락합니다

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

TCP 서버 구축

TCP 서버는 클라이언트를 기다렸다가 연결을 수락합니다. 수명 주기는 소켓 생성, 포트에 바인딩, 대기, 반복적인 연결 수락 순서로 진행됩니다.

1단계: 소켓 생성

IPv4 TCP용 스트림 소켓을 생성합니다. 음수 결과는 실패를 의미합니다.

#include <sys/socket.h>
#include <stdio.h>

int make_server_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) { perror("socket"); }
    return fd;
}

2단계: 주소 재사용 허용

기본적으로 서버가 중지된 후 포트가 TIME_WAIT 상태로 남아 재시작을 막습니다. setsockopt으로 SO_REUSEADDR을 설정하면 즉시 다시 바인딩할 수 있습니다.

#include <sys/socket.h>

void allow_reuse(int fd) {
    int yes = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
}

3단계: 포트에 바인딩

bind()는 소켓을 로컬 주소와 포트에 연결합니다. INADDR_ANY는 모든 네트워크 인터페이스에서 수신하도록 합니다.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int bind_port(int fd, unsigned short port) {
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(port);
    if (bind(fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
        perror("bind"); return -1;
    }
    return 0;
}

4단계: 수신 대기

listen()은 소켓을 수동 상태(수락할 준비가 된 상태)로 표시합니다. backlog 인수는 커널이 대기열에 넣을 수 있는 보류 중 연결 수를 지정합니다.

#include <sys/socket.h>
#include <stdio.h>

int start_listen(int fd) {
    if (listen(fd, 16) < 0) { /* backlog of 16 */
        perror("listen"); return -1;
    }
    return 0;
}

5단계: 연결 수락

accept()는 클라이언트가 연결할 때까지 대기한 다음 해당 클라이언트를 위한 새 소켓을 반환합니다. 원래 소켓은 계속 수신 대기합니다.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int accept_one(int listen_fd) {
    struct sockaddr_in cli;
    socklen_t len = sizeof cli;
    int conn = accept(listen_fd, (struct sockaddr *)&cli, &len);
    if (conn < 0) perror("accept");
    return conn;
}

두 소켓, 두 역할

accept 후에는 소켓이 두 개 있습니다.

  • 수신 대기 소켓은 새 클라이언트를 계속 수락합니다.
  • 연결 소켓은 특정 클라이언트 한 명과 통신합니다.

해당 클라이언트와의 작업이 끝나면 연결 소켓을 닫으십시오.

요청 읽기

recv를 사용해 클라이언트 데이터를 버퍼로 읽습니다. 반환값 0은 클라이언트가 연결을 끊었다는 뜻이고, -1은 오류를 뜻합니다.

#include <sys/socket.h>
#include <stdio.h>

void handle(int conn) {
    char buf[256];
    ssize_t n = recv(conn, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("got: %s\n", buf); }
}

응답 보내기

send로 응답하십시오. 큰 데이터는 한 번의 호출로 버퍼 일부만 기록될 수 있으므로 모든 바이트가 전송될 때까지 반복하십시오.

#include <sys/socket.h>
#include <string.h>

void reply(int conn) {
    const char *msg = "hello from server\n";
    size_t left = strlen(msg);
    const char *p = msg;
    while (left > 0) {
        ssize_t n = send(conn, p, left, 0);
        if (n <= 0) break;
        p += n; left -= (size_t)n;
    }
}

수락 반복문

간단한 반복형 서버는 클라이언트 한 명을 수락하고 서비스를 제공한 뒤 닫고, 다시 반복하여 다음 클라이언트를 수락합니다. 클라이언트를 한 번에 한 명씩 처리합니다.

#include <unistd.h>

void serve_loop(int listen_fd, int (*accept_one)(int), void (*handle)(int)) {
    for (;;) {
        int conn = accept_one(listen_fd);
        if (conn < 0) continue;
        handle(conn);
        close(conn); /* done with this client */
    }
}

정상적인 종료

서버가 중지될 때 수신 대기 소켓을 닫고, SIGINT를 처리해 반복문을 깔끔하게 빠져나오십시오. 커널 리소스를 해제하려면 디스크립터를 항상 닫아야 합니다.

빠른 확인

TCP 서버에 대한 이해도를 확인해 보십시오.

복습

TCP 서버를 단계별로 구축했습니다.

  • socket, 그다음 SO_REUSEADDR, bind, listen, accept
  • accept는 클라이언트별 새 소켓을 반환합니다.
  • recv/send로 통신한 다음 연결을 닫습니다.
  • 반복문으로 클라이언트를 처리하고 모든 반환값을 확인합니다.

자주 묻는 질문

“TCP 서버” 강의는 무료인가요?

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

“TCP 서버”에서 뭘 배우나요?

연결을 수락합니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“TCP 서버” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 소켓 개요
  2. TCP 서버
  3. TCP 클라이언트
  4. 여러 클라이언트 처리
← C Academy(으)로 돌아가기