TCP는 연결과정보다 종료과정이 더 중요하다. 종료과정에서 예기치 못한 일이 발생할 수 있기 때문.
일방적 연결종료
두 기기 중 한 쪽이 close() 함수를 실행해 양방향 연결을 모두 끊는 것.
왜 문제인가?
- 종료 시점 이후 다른 쪽이 보낸 데이터를 더 이상 받을 수 없기 때문
- 특히 이 데이터가 중요성이 높다면 더 위험할 수 밖에 없다.
소켓과 스트림
- 소켓을 통해 두 기기(호스트)가 연결된 상태를 스트림이 형성된 상태라고 한다.
- 양방향 통신을 위해서는 두개의 스트림이 필요하다.
- 일방적 연결종료는 스트림 2개를 동시에 종료한다.
우아한 연결종료
두 기기 중 한 쪽이 단방향 연결만 끊는 것을 의미.
shutdown 함수
c
#include <sys/socket.h>
int shutdown(int sock, int howto);
/*
howto : 종료방법에 대한 정보 전달
- SHUT_RD : 입력스트림 종료
- SHUT_WR : 출력스트림 종료
- SHUT_RDWR : 입출력 스트림 종료
*/
왜 반만 닫아야 하는가?
파일을 전송할 서버는 단순히 보내기만 하면 된다.
그러나, 클라이언트는 언제까지 파일을 받아야 할지 알 수 없다.
무제한으로 입력함수를 호출했다 가는 블로킹 상태에 빠질수도 있다.
물론, EOF를 서버에서 전송하는 것으로 끝내버려도 된다.
그러나 서버는 마지막으로 클라이언트가 잘 받았음을 나타내는 문구를 받을 수 없다.