Study/CS 기초

소켓 프로그래밍

김 도경 2024. 10. 29. 11:32

[2024.10.28] 필수 온라인 강의 Part4 시스템 프로그래밍 CH04 소켓 프로그래밍

 

소켓
  • 소켓 (socket)
    네트워크를 경유하는 프로세스 간 통신의 종착점
    - 우체통이라고 생각하는 게 편함!!! 전송계층 위에, 운영계층 아래에 위치함
    - 송신지 프로세스는 메세지를 소켓으로 보내고 수신지 프로세스는 메세지를 소켓에서 읽는다
    * 파일 입출력과 비슷!!! 소켓 == 특별한 파일!!!!! 으로 인식

  • 소켓의 구성 요소
    - TCP + IP 혹은 UDP + IP
    - 출발지 IP 주소
    - 출발지 포트 번호
    - 목적지 IP 주소
    - 목적지 포트 번호

  • 소켓 프로그래밍 ≒ 파일 입출력
     - 소켓은 특별한 형태의 파일이라 볼 수 있다
     - 파일 열기, 닫기, 쓰기, 읽기
     - 소켓 열기, 닫기, 송신하기, 수신하기

    -> 소켓 통신 = 프로세스 간 통신
    - 소켓은 프로세스 간 통신 기법(IPC)의 일종이다
    - 수신 프로세스 & 송신 프로세스

  • TCP 소켓 vs UDP 소켓
     - TCP와 UDP의 차이 복습 : https://glowdp.tistory.com/43
     - 연결 지향형 vs 비연결지향형

  • 소켓 프로그래밍
    - https://docs.python.org/3/library/socket.html
    - https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html
TCP 소켓 다루기
  • TCP 소켓 프로그래밍의 큰 그림
    - socket(): 소켓을 생성
    - bind(): 호스트의 IP 주소를 소켓에 연결
    - listen(): LISTEN 상태로 전환
    - accept(): 연결 요청 수락
    - connect(): 연결 요청
    - recv() / send(): 소켓으로 송수신 • close(): 소켓 닫기

  • 소켓 생성
    Parameter
            - domain: 통신 도메인 지정 (프로토콜 집단)
                    - AF_UNIX, AF_LOCAL: 로컬 통신
                    - AF_INET: IP 버전 4 : 보통 이거 사용함
                    - AF_INET6: IP 버전 6
                    - AF_IPX: 노벨 네트워크의 통신 프로토콜
            - type: 통신 방법 지정
                    - SOCK_STREAM: 연결형 통신
                    - SOCK_DGRAM: 비연결형 통신
            - protocol: 특정 프로토콜 지정
                    -> 일반적으로 0
    Return
            - 성공시 소켓 디스크립터
            - 실패시 -1

  • IP 주소를 소켓에 연결
    - Parameter
           - socketfd : 생성된 소켓 디스크립터
           - my_addr : 호스트의 주소
           - addrlen: my_addr의 바이트 길이
    Return
           - 성공시 0
           - 실패시 -1

  • LISTEN 상태(연결 요청 대기)로 전환
    Parameter
         - socketfd: 소켓 디스크립터
         - backlog: 연결 요청을 담을 큐 (다수의 연결 요청이 들어올 수 있으므로)
    Return
          - 성공시 0
          - 실패시 -1
  • 상대방 연결 요청 수락
    Parameter
           - socketfd: 소켓 디스크립터
           - addr: 연결 요청한 상대에 대한 정보
           - addrlen: addr의 바이트 단위 길이
    Return
           - 성공시 음이 아닌 정수형의 소켓 디스크립터
           - 실패시 -1
  • 연결 요청
    Parameter
    - sockfd: 소켓 디스크립터
    - serv_addr: 통신을 연결할 상대에 대한 정보
    - addrlen: serv_addr의 길이

    Return
    - 성공시 0
    - 실패시 -1

  • 메세지 송수신
    Parameter
           - sockfd: 송수신할 소켓 디스크립터
           - msg: 송수신할 메세지
           - msg_len: 메세지 길이 - flags: 송수신 방법

    Return
           - send : 성공시 전송한 문자 수, 실패시 -1
           - recv : 성공시 수신한 바이트 수, 실패시 -1

  • 연결 해제
    Parameter
           - fd: 닫으려는 소켓 디스크립터 (파일 디스크립터로 close하는 것과 동일!)
    Return
           - 성공시 0
           - 실패시 -1
UDP 소켓 다루기
  • UDP 소켓 프로그래밍의 큰 그림

- socket(): 소켓을 생성
- bind(): 호스트의 IP 주소를 소켓에 연결
- sendto(): 메세지 송신
- recvfrom(): 메세지 수신
- close(): 소켓 닫기

 

  • 소켓 생성
    Parameter
          - domain: 통신 도메인 지정 (프로토콜 집단)
               - AF_UNIX, AF_LOCAL: 로컬 통신
               - AF_INET: IP 버전 4
               - AF_INET6: IP 버전 6
               - AF_IPX: 노벨 네트워크의 통신 프로토콜
          - type: 통신 방법 지정
               - SOCK_STREAM: 연결형 통신
               - SOCK_DGRAM: 비연결형 통신
          - protocol: 특정 프로토콜 지정          -> 일반적으로 0
    Return
         - 성공시 소켓 디스크립터
         - 실패시 -1

  • IP 주소를 소켓에 연결

Parameter
     - socketfd : 생성된 소켓 디스크립터
     - my_addr : 호스트의 주소
     - addrlen: my_addr의 바이트 길이
Return
     - 성공시 0
     - 실패시 -1

 

  • 메세지 송신

Parameter
     - socketfd: 소켓 디스크립터
     - msg: 송신할 메세지를 저장할 공간
     - len: 전송할 메세지의 길이
    - flags: 송신 방식 결정 à 일반적으로 0
    - to: 메세지를 송신할 상대 호스트의 정보
    - tolen: to의 바이트 단위 크기
Return
    - 성공시 송신한 메세지의 크기
    - 실패시 -1

  • 메세지 수신

 

Parameter
      - socketfd: 소켓 디스크립터
      - buf: 수신할 메세지를 저장할 공간
      - len: buf의 크기
      - flags: 수신 방식 결정 à 일반적으로 0 - from: 메세지를 송신한 호스트의 정보
      - fromlen: from의 바이트 단위 크기
Return
      - 성공시 수신한 메세지의 바이트 크기
      - 실패시 -1

  • 연결 해제

Parameter
      - filedes: 닫으려는 소켓 디스크립터 (파일 디스크립터로 close하는 것과 동일!)
Return
      - 성공시 0
      - 실패시 -1