TCP 클라이언트
연결하고 전송합니다
TCP 클라이언트은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
TCP 클라이언트 구축
TCP 클라이언트는 서버에 연결한 다음 데이터를 보내고 받습니다. 수명 주기는 서버보다 짧으며 소켓 생성, 연결, 통신, 종료 순서로 진행됩니다.
1단계: 소켓 생성
서버와 마찬가지로 IPv4 TCP용 스트림 소켓을 생성합니다.
#include <sys/socket.h>
#include <stdio.h>
int make_client_socket(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) perror("socket");
return fd;
}2단계: 서버 설명
서버의 포트와 IP를 사용해 sockaddr_in을 채웁니다. inet_pton을 사용해 점으로 구분된 IP 문자열을 이진 형식으로 변환하십시오.
#include <arpa/inet.h>
#include <netinet/in.h>
int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
addr->sin_family = AF_INET;
addr->sin_port = htons(port);
return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}3단계: 연결
connect()는 서버와 TCP 핸드셰이크를 수행합니다. 성공하면 소켓이 데이터를 주고받을 준비가 되고, 실패하면 errno가 설정됩니다(예: 연결이 거부됨).
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
int do_connect(int fd, struct sockaddr_in *addr) {
if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
perror("connect"); return -1;
}
return 0;
}바인딩은 필요하지 않음
클라이언트는 일반적으로 bind를 건너뜁니다. connect 중에 커널이 임시 소스 포트를 자동으로 할당하기 때문입니다. 특정 소스 포트가 필요할 때만 클라이언트를 바인딩합니다.
4단계: 데이터 보내기
연결한 후 send로 요청을 작성합니다. 버퍼 전체가 전송되도록 반복하십시오.
#include <sys/socket.h>
#include <string.h>
int send_all(int fd, const char *data) {
size_t left = strlen(data);
const char *p = data;
while (left > 0) {
ssize_t n = send(fd, p, left, 0);
if (n <= 0) return -1;
p += n; left -= (size_t)n;
}
return 0;
}5단계: 응답 받기
recv로 서버의 응답을 읽습니다. 버퍼를 문자열로 취급하기 전에 널 문자로 종료하십시오.
#include <sys/socket.h>
#include <stdio.h>
void read_reply(int fd) {
char buf[512];
ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
else if (n == 0) printf("server closed connection\n");
}연결이 닫힐 때까지 읽기
한 번의 recv 호출로 전체 응답을 받지 못할 수 있습니다. 여러 조각으로 도착하는 전체 응답을 읽으려면 recv가 0(상대편이 닫음)을 반환할 때까지 반복하십시오.
#include <sys/socket.h>
#include <stdio.h>
void drain(int fd) {
char buf[256]; ssize_t n;
while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
fwrite(buf, 1, (size_t)n, stdout);
}6단계: 닫기
close(fd)를 호출해 연결을 끝내고 디스크립터를 해제합니다. 이렇게 하면 TCP FIN이 전송되어 서버가 클라이언트의 작업이 끝났음을 알게 됩니다.
#include <unistd.h>
void finish(int fd) {
close(fd);
}shutdown으로 반쯤 닫기
shutdown(fd, SHUT_WR)은 쓰기 방향만 닫아 요청이 끝났음을 알리면서도 클라이언트가 응답을 읽을 수 있게 합니다. 요청 후 응답을 보내는 프로토콜에 유용합니다.
연결 실패 처리
일반적인 클라이언트 오류에는 ECONNREFUSED(수신 대기 중인 서버가 없음), ETIMEDOUT(호스트에 연결할 수 없음), EHOSTUNREACH가 있습니다. 항상 connect의 결과를 확인하고 실패한 경우 사용자에게 명확히 알리십시오.
빠른 확인
TCP 클라이언트에 대한 이해도를 확인해 보십시오.
복습
TCP 클라이언트를 만들었습니다.
- 소켓을 만든 다음 서버의
sockaddr_in에 연결합니다 - bind는 필요하지 않습니다. 커널이 원본 포트를 선택합니다
- 요청을 보내고 응답을 받습니다(전체 데이터를 받으려면 반복합니다)
- 작업이 끝나면 close 또는 shutdown을 호출하고 연결 실패를 처리합니다
자주 묻는 질문
“TCP 클라이언트” 강의는 무료인가요?
네 — “TCP 클라이언트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“TCP 클라이언트”에서 뭘 배우나요?
연결하고 전송합니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“TCP 클라이언트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 소켓 개요
- TCP 서버
- TCP 클라이언트
- 여러 클라이언트 처리