반응형

 

socket() : 소켓 개설

  • socket()으로 소켓 개설할 시 TCP, UDP 소켓을 선택 (TCP > SOCK_STREAM)
  • 소켓 만들 때, Transport Protocol만 지정
    • 소켓을 이용한 통신 프로그램 : 사용할 Transport Protocol, 자신 IP/Port, 상대방 IP/Port 필요
    • 여기에선 그중에서 Transport Protocol만 지정
  • 응용 프로그램 : Protocol 지정, socket() 호출
    소켓 인터페이스(TCP/IP) : return  새로 생성된 소켓의 소켓번호;

 

connect() : 서버에 연결 요청

클라이언트 connect() 호출 > 3-Way Handshake 시작

문법

int connect (
    int s,                                       // 서버와 연결시킬 소켓 번호
    const struct sockaddr *addr,  // 상대방 서버의 소켓주소 구조체
    int addrlen);                           // 구조체 *addr의 크기

 

  • connect() 성공(0 리턴), 실패(-1 리턴, 전역변수 errno에 에러코드가 들어감)
  • connect() 성공하려면 서버에서는 listen(), accept() 호출해 두고 있어야 함
  • connect() 호출 중에 에러 발생시 : 다시 connect()호출 (X) , close() 후 새로 socket() (O)

 

send(), recv() : 데이터 송수신

 

  • 스트림형(TCP) 소켓을 통하여 데이터를 송수신
  • flags 옵션
    • 일반 데이터 : 0
    • flags : MSG_PEEK > 수신된 데이터 읽은 뒤, 데이터를 수신버퍼에 남겨둬서 다음번 read()에서도 같은 데이터를 다시 읽을 수 있도록 합니다.
  • MSS(maximum segment size) : 한 IP 데이터그램에 실어서 전송할 수 있는 최대 데이터 크기
    • MSS 보다 큰 데이터를 write(), send()하면 전체 데이터가 MSS 크기로 분할되어 전송됩니다.
    • TCP에서는 segment의 순서 확인, 데이터그램 분실을 수신 측에서 검사&재전송 > 신뢰할만한 통신
      UDP에서는 이러한 에러제어 제공 X
  • TCP 소켓에서 write()나 send()를 실행하면
    • 데이터는 TCP계층의 송신 버퍼에(send buffer)로 들어갑니다.
    • 송신버퍼가 비어있지 않으면
      • 프로세스는 블록 상태로 가고 프로그램은 write()문에서 기다리게 됩니다.
        > write()문이 블록 된 경우에 송신 버퍼에 먼저 들어 있던 데이터가 전송되고
        > write한 데이터가 송신버퍼로 모두 아동 하면 write() 문이 return 됩니다.
        • write() 문이 return 됐다 > 데이터가 자신의 TCP에 있는 송신 버퍼에 들어갔다 (목적지에 전달 X)

 

close() : 소켓 닫기

  • 소켓의 사용을 마치려면 해당 소켓번호를 지정하여 close()를 호출
  • 클라이언트나 서버 중 누구나 먼저 호출 가능
  • 송신버퍼
    • 기본적으로는 송신버퍼에 있는 데이터들 모두 보내고 TCP연결 종료
    • 소켓 옵션을 변경하여 미전송 된 데이터를 모두 버리고 종료할 수 있음
반응형