본문 바로가기
이론공부/컴퓨터네트워크

[컴퓨터네트워크]02. 애플리케이션 계층2 - Socket Programming

by Ssubini 2022. 5. 1.

소켓(Socket)이란?

  • 애플리케이션(application)과 네트워크 간의 인터페이스
    • 애플리케이션이 소켓을 생성함
    • 소켓의 타입은 커뮤니케이션 스타일을 나타냄
      • reliable vs best effort
      • connection-oriented vs connectionless
  • 소켓이 일단 생성되면
    • 네트워크 전송을 위해 소켓에 데이터를 전달함
    • 소켓으로부터 다른 호스트가 보내온 데이터를 받아옴
  • TCP 방식으로 보내고 싶다면 TCP 소켓으로, UDP 방식으로 보내고 싶다면 UDP 소켓으로

소켓의 두 가지 종류

  • UDP 소켓 (SOCK_DGRAM_ 소켓 데이터그램)
    • 안정적이지 않은 전달
    • 순서가 보장되지 않음
    • '연결(connection)'의 개념이 없고, 앱이 각 패킷에대해 목적지를 표시함
    • send또는 receive 만 가능( 단방향적인건가?? )
  • TCP 소켓 (SOCK_STREAM)
    • 안정적인 전달
    • 순서 보장됨
    • 연결(connection) 기반
    • 양방향성을 가짐

Sockets API

  1. Function : socket()
    •  
    • int socket(int domain, int type, int protocol);
    • 소켓 생성
      • file descriptor나 -1을 반환하는 함수, 실패시 errno 설정
      • Parameter
        • domain : protocol family ( = address family )
        • type : 커뮤니케이션 방식(SOCK_STREAM(TCP) / SOCK_DGRAM(UDP))
        • protocol : protocol within family
  2. Function : bind()
    • int bind (int sockfd, struct sockaddr* myaddr, int addrlen);
    • socket()에서 생성한 소켓의 IP를 이용해서 특정 포트넘버에 바인딩 하겠다.
  3. Function : listen()
    • int listen (int sockfd, int backlog);
    • socket()에서 생성한 소켓을 listen 용도로 사용할 것이며, 혹시 동시에 request 가 들어오면 동시에 몇개까지 queue에 담아놓고 순서대로 처리하겠다.
  4. Function : accept()
    • int accept(int sockfd, struct sockaddr* cliaddr, int* addrlen);
    • 준비 동작이 완료되었고 클라이언트로부터 연결을 기다리겠다.
    • accept는 수행되면 block 되어있다가, 클라이언트로부터 connection 요청이 들어오면 수행이 되면서 return 됨. return 될 때 두 번째 parameter cliaddr에 클라이언트의 ip와 port number가 저장이 됨 -> 서버도 클라이언트의 ip주소와 port number를 알게됨
  5. Function : connect()
    • int connect (int sockfd, struct sockaddr* servaddr, int addrlen);
    • parameter로 server의 주소와 port number가 필요함

참고

클라이언트쪽에서 bind() 함수 사용되지 않는 이유 : bind는 특정 소켓을 특정 포트넘버에 바인드 해주는 개념인데 클라이언트는 특정 포트에 bind 할 필요가 없음(아무 포트나 사용해도 됨) -> 굳이 할 필요 없음

참고

서버/클라이언트 예시 소스코드 -> 패드 필기 자료(3.pdf) 참고

  1. Function : write()
  2. Function : read()
  3. Function : close()
    • 데이터 교환이 다 끝난 후 최종적으로 close 해서 주어야 다른 프로세서가 소켓 사용 가능함.
  1.  

댓글