소켓프로그래밍 , TCP/IP

MELIES·2025년 2월 19일

TCP/IP와 소켓의 관계

TCP/IP 소켓 프로그래밍의 특징

  1. TCP 연결 지향성
// SOCK_STREAM: TCP 프로토콜 사용
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  • 신뢰성 있는 데이터 전송
  • 데이터 순서 보장
  • 연결 기반 통신
  1. IP 주소 체계 사용
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;      // IPv4
serverAddr.sin_addr.s_addr = INADDR_ANY;  // IP 주소
serverAddr.sin_port = htons(6667);    // 포트 번호
  • IPv4 또는 IPv6 주소 체계
  • 포트 번호로 서비스 구분
  1. 연결 설정 과정
// 서버 측
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
listen(serverSocket, 5);
accept(serverSocket, NULL, NULL);

// 클라이언트 측
connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
  1. 데이터 전송 보장
// 데이터 송신
send(clientSocket, message, strlen(message), 0);

// 데이터 수신
recv(clientSocket, buffer, sizeof(buffer), 0);
  • 패킷 손실 자동 복구
  • 흐름 제어 및 혼잡 제어

UDP와의 차이점

IRC 서버에서의 TCP/IP 특징 활용

  1. 연결 유지 및 관리
// 클라이언트 연결 상태 확인
if (eventList[i].flags & EV_EOF) {
    // 연결 종료 감지
    close(eventList[i].ident);
}
  1. 신뢰성 있는 메시지 전달
// IRC 메시지 전송
std::string msg = ":server 001 " + nickname + " :Welcome\r\n";
send(clientSocket, msg.c_str(), msg.length(), 0);
  1. 순서 보장
// 채널 메시지 브로드캐스팅
void broadcastMessage(Channel* channel, const std::string& message) {
    for (auto client : channel->getClients()) {
        send(client->getSocket(), message.c_str(), message.length(), 0);
    }
}

따라서 TCP/IP 소켓 프로그래밍은 소켓 API를 통한 기본적인 네트워크 프로그래밍에 TCP의 연결 지향성과 신뢰성 IP의 주소 체계와 라우팅을 더한 것

1. 소켓 통신 (Socket Communication)

  • 네트워크 통신을 위한 엔드포인트(프로그래밍 인터페이스)
// 기본적인 소켓 통신 흐름
int sock = socket();     // 소켓 생성
bind();                  // 주소 할당
listen();               // 연결 대기
accept();               // 연결 수락
send()/recv();          // 데이터 송수신
close();                // 연결 종료

2. TCP/IP

  • TCP: 신뢰성 있는 데이터 전송 프로토콜
  • IP: 네트워크 주소 지정과 라우팅 프로토콜
// TCP/IP 관련 구조체
struct sockaddr_in {
    sa_family_t     sin_family;    // 주소 체계 (AF_INET)
    in_port_t       sin_port;      // 포트 번호
    struct in_addr  sin_addr;      // IP 주소
};

3. TCP/IP 소켓 통신

  • 소켓 API를 통해 TCP/IP 프로토콜 사용
// TCP/IP 소켓 통신 예시
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);  // TCP 소켓 생성

sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;                     // IPv4
serverAddr.sin_addr.s_addr = INADDR_ANY;            // IP 주소
serverAddr.sin_port = htons(PORT);                  // 포트 번호

bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));
  • 실제 IRC 서버에서 적용
// 1. 소켓 통신 부분
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
bind(serverSocket, ...);
listen(serverSocket, 5);

// 2. TCP/IP 부분
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(6667);

// 3. TCP/IP 소켓 통신
// 연결 수락 및 데이터 송수신
int clientSocket = accept(serverSocket, NULL, NULL);
char buffer[1024];
recv(clientSocket, buffer, sizeof(buffer), 0);  // 신뢰성 있는 데이터 수신
send(clientSocket, response, strlen(response), 0);  // 신뢰성 있는 데이터 송신
  1. 소켓 통신: 네트워크 프로그래밍 인터페이스 제공
  2. TCP/IP: 신뢰성 있는 데이터 전송과 네트워크 주소 지정
  3. TCP/IP 소켓 통신: 소켓 API를 통한 TCP/IP 프로토콜 사용
profile
42 Seoul

0개의 댓글