네트워크 프로그래밍07 소켓의 우아한 연결종료

zh025700·2022년 4월 5일
0

네트워크 프로그래밍


7. 소켓의 우아한 연결종료

TCP 기반의 Half-clsoe

TCP에서는 연결보다 종료가 중요하다.
연결에선 변수가 발생하지 않지만, 종료에선 예상치 못한 일이 벌어질 수도 있다.
=> 명확해야한다.

일방적인 연결종료의 문제점

close 함수 = 완전 종료를 의미
=>데이터 전송, 수신 모두 불가

그렇다면... 만약 데이터가 도착하지 못했는데 close함수가 실행된다면???
            **보내지는 데이터가 소멸~~~!!**

해결법:
일부만 종료(half-close)를 이용하자!

소켓, 스트림

소켓을 통해 두 호스트가 연결이 된다면, 상호간에 데이터 송수신이 가능해진다.

=> 이를 "스트림이 형성된 상태"라고 한다.

소켓의 스트림은 한쪽 방향으로만 데이터 이동이 가능하다.

=> 양방향 통신을위해서는 두개의 스트림이 필요!!

  • 서버 -> 클라이언트
    write -> 출력버퍼 -> 스트림 -> 입력버퍼 -> read
  • 클라이언트 -> 서버
    write -> 출력버퍼 -> 스트림 -> 입력버퍼 -> read

=> 한 쪽만 가능하니 두개의 스트림이 생성되어 통신을 한다

그런데 close 함수를 사용해 소켓에 연결을 끊으면!
두개의 스트림 모두 끊어진다...
그래서 half-close를 사용하자!

shutdown함수

shutdown(int sock, int howto)

sock: 종료할 소켓의 파일디스크립터
howto: 종료방법 정보

종료 방법 매개변수에 따라 종료의 방법이 결정됨!

종료 방법

  • SHUT_RD : 입력 스트림 종료
    • 데이터를 수신할 수 없다. 버퍼에 남아있어도 지워짐!
  • SHIT_WR : 출력 스트림 종료
    • 버퍼에 남아있는 데이터는 목적지로 전송 됨!
  • SHUT_RDWR : 입출력 스트림 종료
    • 위의 두 종료 조건을 둘다 호출한 것과 결과 같음

Half-close가 필요한 이유

이게 왜.. 필요한거지...

만약 통신 마지막 과정에 클라이언트가 서버에 종료 메시지를 보내려면?

클라이언트는 통신 마지막 과정을 알 수 없다.
그렇다고 서버에서 계속 메시지가 오는지 확인하기위해 함수를 호출하면 블록킹이 일어난다.

그래서 EOF를 통신 마지막에 전송한다.

어떻게 EOF를 보내나?

출력 스트림을 종료하자!

close를 통해 스트림을 모두 종료해도 되지만, 이럴 경우 종료 메시지를 보낼 수 없다.
이러한 이유 덕에 half-close가 필요하다..!

종료메시지 구현

  • 서버
  1. 원래 TCP 과정
  2. shutdown(클라이언트 소켓, SHUT_WR)
  3. read(클라이언트 소켓,메시지,크기)
  4. close 소켓!
  • 클라이언트
  1. 원래 TCP과정
  2. while로 EOF 탐지
  3. 종료 메시지 보내
  4. close 소켓
profile
정리

2개의 댓글

comment-user-thumbnail
2022년 4월 9일

프로필에 검은색 사진은 항상 「검은색 배경화면..」 이라고 검색한 후 다운받아서 설정하시나요??

1개의 답글