Computer/서버 & 네트워크

소켓/소켓 API

에린_1 2024. 2. 25. 20:08
728x90

소켓/소켓 API

소켓 API

  • 정의
    • System call API 중 하나이다.
    • 운영체제가 응용프로그램에게 제공하는 통신용 인터페이스다.
  • 역할
    • 컴퓨터 하드웨어의 네트워크 통신장치를 응용프로그램이 간접적으로 이용할 수 있게 해준다.

소켓

  • 정의
    • 응용프로그램에 설치하는 데이터 송수신 출입구
  • 사용하는 이유
    • 응용프로그램은 응용프로그램의 일만 처리하도록 하기 위해서 사용한다. 응용프로그램이 데이터 송수신을 위한 각종의 일을 직접 수행할 필요가 없다.
    • 통신의 업무는 운영체제의 네트워크 스택이 해준다.
      • 네트워크 스택이 하는 일
        • 데이터의 패킷화
        • 주소 지정
        • 라우팅
        • 전송 오류 처리
    • 컴퓨터가 데이터들을 송수신할 때, 꼬이지 않게 해준다.
      • 컴퓨터 내에서 실행되는 다양한 프로세스가 엄청난 양의 데이터 송수신을 일으키는데, 운영체제에 의해 데이터 송수신이 관리되면 다양한 문제를 해결할 수 있다. 그래서 운영체제는 응용프로그램에게 통신시 사용할 수 있는 socket API를 제공하여 응용프로그램은 데이터를 보내고 받기만 할 수 있게 한다.
      • 어떤 응용프로그램에서 송수신하는 데이터인지 운영체제 측에서 알아야 하는데 이 소켓이 프로세스별 end point로 역할하여 송시신지가 문제없이 관리된다.

소켓 API 사용법

  1. 소켓 생성
    • 통신을 위한 소켓을 생성한다.
    int sockfd = socket(domain, type, protocol);
    
    • 인자
      • domain
        • 프로토콜 주소체계 지정
        • IPv4 : ‘AF_INET’
        • IPv6 : ‘AF_INET6’
        • 로컬 : ‘AF_UNIX’ or ‘AF_LOCAL’
      • socket type
        • TCP 방식 : ‘SOCK_STREAM’
        • UDP 방식 : ‘SOCK_DGRAM’
      • protocol
        • 프로토콜 지정 인자
        • 기본 프로토콜 : 0
        • TCP 방식 : ‘IPPROTO_TCP’
        • UDP 방식 : ‘IPPROTO_UDP’
    • 반환값
      • 생성된 socket에 대한 File Descriptor로, 운영체제에 의해 생성되며, 이후 소켓을 사용할 때 인자 값으로 보내야 한다.
  2. 소켓 바인딩
    • 소켓에 IP주소와 포트 번호를 할당하는 것이다.
    • 서버 프로그램에서 주로 사용한다.
    bind(sockfd, (struct sockaddr*)&my_addr, sizeoof(my_addr));
    
    • 인자
      • socket descriptor
      • address
        • socket이 바인딩 될 주소(구조체의 포인터)
        • IP와 PORT 번호 설정
      • address length
        • 주소 구조체의 크기 지정
  3. 연결 수립
    • 클라이언트
      • connect() : 서버에 연결 요청
    • 서버
      • listen() : 클라이언트 요청 확인
      • accept() : 클라이언트의 연결 요청 수락
    //클라이언트
    connect(sockfd, (struct sockaddr*)&server_addr,sizeof(server_addr));
    
    //서버
    listen(socked, backlog);
    int new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &addr_size)
    
    • 인자
      • listen
        • socket description
        • 대기 큐의 길이(backlog)
      • accecpt
        • socket description
        • address
          • socket이 바인딩 될 주소
          • IP, PORT 번호
        • address length
          • 주소 구조체의 크기 지정
      • connect
        • socket descriptor
        • server address
  4. 데이터 송수신
    • 데이터 송신
    • 데이터 수신
    send(sockfd, "Hello, world!", data_size, flags);
    recv(sockfd, buffer, sizeof(buffer), flags);
    
    // UDP
    sendto(sockfd, "Hello, world!", data_size, flags, dest_addr, addr_len);
    recvfrom(sockfd, buffer, sizeof(buffer), flags, dest_addr, addr_len);m);
    
    • read와 write도 동일한 목적으로 사용 가능하다.
      • LINUX에서만 사용 가능하다
      • 네트워크 장치를 file로 인식하는 OS 특성상 사용 가능한 system call 함수이다.
      • 네트워크 실행 특성을 반영하는 정보를 읽고 쓰기 위해 만들어진 것이 아니기 때문에 기능이 제한적이다.
      • 이 때문에, UDP의 경우 반드시 send를 써야 동신이 가능하다.
    • 인자
      • socket descriptor
      • data buffer
        • 전송할 데이터를 담고 있는 버퍼이다. 또는 수신된 데이터를 저장할 버퍼의 포인터다.
      • data size
        • data byte 수
      • flags
        • 데이터 송수신 동작 제어를 위한 옵션 플래그
      • 대상 주소
        • UDP의 경우에만, 상대방의 주소정보를 담은 구조체의 포인터
      • 주소 길이
        • 상대방의 주소 구조체의 크기
  5. 소켓 닫기
    • close 통신 완료 후, 소켓을 닫고 리소스를 해제한다.
    close(sockfd);
    
    • 인자
      • socket file descriptor
728x90

'Computer > 서버 & 네트워크' 카테고리의 다른 글

HTTP(Hyper Text Transfer Protocol)  (0) 2024.02.25
웹 서버  (0) 2024.02.25
파일 식별자File Descriptor(FD)  (0) 2024.02.25
클라이언트 - 서버 모델  (0) 2024.02.24
OSI 7계층 & TCP/IP 4계층  (0) 2024.02.23