열렬히.뛰기

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

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

TCP는 연결과정보다 종료과정이 더 중요하다. 종료과정에서 예기치 못한 일이 발생할 수 있기 때문.

일방적 연결종료

두 기기 중 한 쪽이 close() 함수를 실행해 양방향 연결을 모두 끊는 것.

왜 문제인가?

  • 종료 시점 이후 다른 쪽이 보낸 데이터를 더 이상 받을 수 없기 때문
  • 특히 이 데이터가 중요성이 높다면 더 위험할 수 밖에 없다.

소켓과 스트림

  • 소켓을 통해 두 기기(호스트)가 연결된 상태를 스트림이 형성된 상태라고 한다.
  • 양방향 통신을 위해서는 두개의 스트림이 필요하다.
  • 일방적 연결종료는 스트림 2개를 동시에 종료한다.

우아한 연결종료

두 기기 중 한 쪽이 단방향 연결만 끊는 것을 의미.

shutdown 함수

c
#include <sys/socket.h>

int shutdown(int sock, int howto);

/*
howto : 종료방법에 대한 정보 전달
- SHUT_RD : 입력스트림 종료
- SHUT_WR : 출력스트림 종료
- SHUT_RDWR : 입출력 스트림 종료
*/

왜 반만 닫아야 하는가?

파일을 전송할 서버는 단순히 보내기만 하면 된다.

그러나, 클라이언트는 언제까지 파일을 받아야 할지 알 수 없다.

무제한으로 입력함수를 호출했다 가는 블로킹 상태에 빠질수도 있다.

물론, EOF를 서버에서 전송하는 것으로 끝내버려도 된다.

그러나 서버는 마지막으로 클라이언트가 잘 받았음을 나타내는 문구를 받을 수 없다.

half-close 기반의 파일전송

github.com/InryeolChoi/socket_programming/tree/main/part1/chap7