소켓 프로그래밍은 컴퓨터 네트워크 상에서 두 장치(클라이언트와 서버)가 데이터를 주고받을 수 있도록 통신을 설정하고 관리하는 기술입니다. 이를 위해 다음과 같은 작업 흐름이 필요합니다:
서버(Server):
클라이언트(Client):
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>#include <iostream>: 
std::cout, std::cin 등을 사용 가능하게 함.#include <cstring>:
memset, strcpy.#include <sys/socket.h>:
socket, bind, listen, accept, send, recv.#include <netinet/in.h>:
sockaddr_in, htons, htonl.#include <unistd.h>:
close.#define PORT 8080#define PORT 8080:int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char *hello = "Hello from server";int server_fd, new_socket;:
server_fd: 서버 소켓 파일 디스크립터.new_socket: 클라이언트와 통신에 사용할 새 소켓 디스크립터.struct sockaddr_in address;:
int opt = 1;:
int addrlen = sizeof(address);:
address 구조체의 크기 저장.accept 함수 호출 시 사용.char buffer[1024] = {0};:
const char *hello = "Hello from server";:
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0) {
    perror("socket failed");
    exit(EXIT_FAILURE);
}socket(AF_INET, SOCK_STREAM, 0):
AF_INET: IPv4 프로토콜.SOCK_STREAM: TCP 프로토콜.0: 자동으로 적합한 프로토콜 선택.if (server_fd == 0):
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
    perror("setsockopt");
    exit(EXIT_FAILURE);
}setsockopt():
SOL_SOCKET: 소켓 레벨 옵션.SO_REUSEADDR: 주소 재사용 가능.SO_REUSEPORT: 포트 재사용 가능.에러 체크:
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);address.sin_family = AF_INET:
address.sin_addr.s_addr = INADDR_ANY:
address.sin_port = htons(PORT):
htons: 포트를 빅엔디안으로 변환.if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
    perror("bind failed");
    exit(EXIT_FAILURE);
}bind():
에러 체크:
if (listen(server_fd, 3) < 0) {
    perror("listen");
    exit(EXIT_FAILURE);
}listen():3: 최대 대기 연결 수.new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);
if (new_socket < 0) {
    perror("accept");
    exit(EXIT_FAILURE);
}accept():
에러 체크:
read(new_socket, buffer, 1024);
printf("Message from client: %s\n", buffer);
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");read():
buffer에 저장.printf:
send():
close(new_socket);
close(server_fd);
return 0;close():
new_socket과 server_fd 모두 닫아야 함.return 0: