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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.