1. socket()
📌 역할
소켓(파일 디스크립터)을 생성합니다. TCP/UDP, IPv4/IPv6 등 타입을 설정할 수 있어요.
📘 함수 원형
int socket(int domain, int type, int protocol);
🔸 주요 인자
인자설명
| domain | 주소 체계 (예: AF_INET = IPv4, AF_INET6 = IPv6) |
| type | 소켓 타입 (예: SOCK_STREAM = TCP, SOCK_DGRAM = UDP) |
| protocol | 일반적으로 0 (자동 선택) |
✅ 사용 예시
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP 소켓 생성
2. bind()
📌 역할
서버에서 사용할 IP 주소와 포트 번호를 소켓에 연결합니다.
📘 함수 원형
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
🔸 주요 인자
인자설명
| sockfd | socket()으로 생성한 소켓 디스크립터 |
| addr | IP, 포트 정보를 담은 구조체 (struct sockaddr_in) |
| addrlen | 구조체 크기 (보통 sizeof(struct sockaddr_in)) |
✅ 사용 예시
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(12345);
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
3. listen()
📌 역할
소켓을 수신 대기 상태로 만듭니다 (클라이언트 연결을 기다림).
📘 함수 원형
int listen(int sockfd, int backlog);
🔸 주요 인자
인자설명
| sockfd | bind()한 서버 소켓 |
| backlog | 대기열 크기 (동시 접속 허용 수) |
✅ 사용 예시
listen(sockfd, 5); // 최대 5개의 연결을 큐에 보관
4. accept()
📌 역할
클라이언트 연결을 수락하고 새로운 소켓을 생성합니다.
📘 함수 원형
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
🔸 주요 인자
인자설명
| sockfd | listen()한 소켓 |
| addr | 연결된 클라이언트 주소를 저장할 구조체 |
| addrlen | 주소 구조체의 크기를 담고 있는 포인터 |
✅ 사용 예시
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);
5. connect()
📌 역할
클라이언트가 서버에 연결 요청합니다.
📘 함수 원형
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
🔸 주요 인자
인자설명
| sockfd | socket()으로 만든 클라이언트 소켓 |
| addr | 연결할 서버 주소 (sockaddr_in) |
| addrlen | 구조체 크기 |
✅ 사용 예시
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12345);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(client_sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
6. send() / recv()
📌 역할
TCP 연결된 소켓 간에 데이터를 보내고(receive) 받습니다(send).
📘 함수 원형
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
🔸 주요 인자
인자설명
| sockfd | 연결된 소켓 |
| buf | 데이터 버퍼 (문자열/바이트) |
| len | 전송할 데이터 길이 |
| flags | 일반적으로 0 |
✅ 사용 예시
char msg[] = "hello";
send(sock, msg, strlen(msg), 0);
char buf[1024];
int len = recv(sock, buf, sizeof(buf), 0);
7. close()
📌 역할
소켓 연결을 종료합니다.
📘 함수 원형
int close(int sockfd);
✅ 사용 예시
close(sockfd);
✅ 보너스: 주소 변환 함수
htons(), htonl()
- 호스트 바이트 순서 → 네트워크 바이트 순서 변환
unsigned short htons(unsigned short hostshort);
unsigned long htonl(unsigned long hostlong);
inet_addr() / inet_ntoa()
- 문자열 → IP 주소 변환
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
🔍 요약: 가장 많이 쓰는 기본 흐름
서버 측 순서:
1. socket()
2. bind()
3. listen()
4. accept()
5. recv()/send()
6. close()
클라이언트 측 순서:
1. socket()
2. connect()
3. send()/recv()
4. close()
'NETWORK > Study' 카테고리의 다른 글
| 네트워크 03 : TCP/IP 인터넷 계층 (1) | 2026.04.30 |
|---|---|
| 네트워크 02 : TCP/IP 네트워크 인터페이스 계층 (0) | 2026.04.29 |
| 네트워크 01 : 네트워크(OSI 7 계층, TCP/IP 4 계층) (0) | 2026.04.28 |
| ★매우 중요★ / QT의 TCP 통신의 프로토콜 설계(프레이밍 및 파싱) (0) | 2025.09.01 |
| ★매우중요★ QT에서 TCP 통신 과정 (0) | 2025.09.01 |