[네트워크] 소켓 프로그래밍: 프로토콜, 클라이언트와 서버의 함수호출

2025. 1. 29. 22:36·CS/Network

전공 수업 내용 정리 (문제 발생시 비공개합니다.)

 


소켓의 타입과 프로토콜의 설정

프로토콜의 개념

프로토콜은 컴퓨터 간의 데이터 송수신에 필요한 통신 규약으로, 개념적으로는 약속의 의미를 담고 있다. 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.

TCP 서버의 기본적인 함수 호출 순서

  1. 소켓 생성: socket()
  2. 소켓 주소 할당: bind()
  3. 연결 요청 대기 상태: listen()
  4. 연결 허용: accept()
  5. 데이터 송수신: read()/write()
  6. 연결 종료: close()
  • bind 함수까지 호출이 되면 주소가 할당된 소켓을 얻게 되며, 이후 listen 함수를 호출하여 연결 요청을 받을 수 있는 상태로 변환한다.

연결 요청 대기 상태로의 진입

  • 연결 요청 대기 상태로 진입하기 위해서는 일반 소켓을 서버 소켓으로 바꾸어 주어야 한다.
#include <sys/types.h> 
int listen(int sock, int backlog); 
  • 매개변수:
    • sock: 연결 요청 대기 상태로 두고자 하는 소켓의 파일 디스크립터
    • backlog: 연결 요청 대기 큐의 크기 정보 (예: 5를 전달하면 5개의 연결 요청을 대기시킬 수 있음)
  • listen 함수 호출 후, 소켓이 리스닝 소켓이 된다.

클라이언트의 연결 요청 수락

#include <sys/socket.h> 
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); 
  • 매개변수:
    • sock: 서버 소켓의 파일 디스크립터
    • addr: 연결 요청한 클라이언트의 주소 정보를 담을 변수의 주소값
    • addrlen: 두 번째 매개변수에 전달된 주소 변수의 크기
  • accept 함수를 호출하면 클라이언트와의 통신을 위한 별도의 소켓이 추가로 생성된다.

TCP 클라이언트의 기본적인 함수 호출 순서

  1. 소켓 생성: socket()
  2. 연결 요청: connect()
  3. 데이터 송수신: read()/write()
  4. 연결 종료: close()
#include <sys/socket.h> 
int connect(int sock, const struct sockaddr *servaddr, socklen_t *addrlen); 
  • 매개변수:
    • sock: 클라이언트 소켓의 파일 디스크립터
    • servaddr: 연결할 서버의 주소 정보
    • addrlen: 두 번째 매개변수의 크기

TCP 기반 서버와 클라이언트의 함수 호출 관계

  • 서버의 listen 함수 호출 이후에야 클라이언트의 connect 함수 호출이 유효하다.

이유

  • 서버가 연결을 수락할 준비가 되어 있어야 클라이언트가 연결 요청을 보내고, 이를 처리할 수 있기 때문이다.

Iterative 서버의 구현

  • 반복적으로 accept 함수를 호출하면 계속해서 클라이언트의 연결 요청을 수락할 수 있다.
  • 그러나, 동시에 둘 이상의 클라이언트에게 서비스를 제공할 수 있는 모델은 아니다.

에코 클라이언트의 문제점

잘못된 코드 예시:

write(sock, message, strlen(message));
ste_len = read(sock, message, BUF_SIZE - 1);
message[ste_len] = 0;
printf("Message from server: %s", message);
  • 잘못된 가정: “한 번의 read 함수 호출로 앞서 전송된 문자열 전체를 읽어들일 수 있다.”
  • TCP는 데이터의 경계가 존재하지 않기 때문에, 서버가 전송한 문자열의 일부만 읽혀질 수도 있다.
저작자표시 비영리 동일조건 (새창열림)

'CS > Network' 카테고리의 다른 글

[네트워크] 클래스 기반 주소 지정  (0) 2025.01.29
[네트워크] IP 주소 개요  (0) 2025.01.29
[네트워크] 소켓 프로그래밍 개요  (0) 2025.01.29
[네트워크] TCP 타이머, 옵션  (0) 2025.01.29
[네트워크] TCP segment, control  (0) 2025.01.29
'CS/Network' 카테고리의 다른 글
  • [네트워크] 클래스 기반 주소 지정
  • [네트워크] IP 주소 개요
  • [네트워크] 소켓 프로그래밍 개요
  • [네트워크] TCP 타이머, 옵션
abyss-s
abyss-s
프론트엔드 공부합니다.
  • abyss-s
    abyss-s의 블로그입니다.
    abyss-s
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • Web (16)
        • JavaScript (6)
        • TypeScript (1)
        • React (5)
        • Vue (0)
        • Storybook (1)
        • Next.js (1)
      • Backend & Infra (8)
        • Database (3)
        • Node.js (2)
        • SpringBoot (1)
      • PS (71)
      • CS (30)
        • OS (13)
        • Structure & Algorithm (5)
        • Network (10)
        • 정보처리기사 (2)
      • Language (18)
        • OOP (1)
        • JAVA (13)
        • C++ (4)
      • Activities (12)
        • 멋쟁이 사자처럼 (2)
        • OSSCA (3)
        • LG U+ URECA (3)
        • Project (2)
      • AI (0)
      • Git & Github (5)
      • Notion (1)
      • IT (4)
      • Statistics (11)
      • Book (4)
      • Diary (1)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 백준
    • 트위터
  • 공지사항

    • abyss-s의 티스토리에 오신 것을 환영합니다.
  • 인기 글

  • 태그

    운영체제
    그리디
    네트워크
    BAEKJOON
    자바기반응용프로그래밍
    백준
    Python
    OS
    JavaScript
    DP
    C++
    Java
    생활코딩
    코드트리
    파이썬
    BFS
    React
    자바스크립트
    통계학
    github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
abyss-s
[네트워크] 소켓 프로그래밍: 프로토콜, 클라이언트와 서버의 함수호출
상단으로

티스토리툴바