종료를 말하기 전에 우선 시작된 상태를 말해야 할 것같다.
글보단 그림이 더 좋기 때문에, 그림을 바로 띄우면 아래 그림과 같다.

1. 소켓의 우아한 종료가 왜 필요 할까?

소켓 정상적인 접속 중


이 모습은 소켓의 정상적인 연결 상태를 보여준다.
각각의 소켓은 입·출력 스트림을 가지고(가진다는 표현이 좋겠다) 있어, 입력을 받거나, 출력을 하게 된다.

그리고 접속을 종료하게 될때 우리는 closesoket 함수를 이용하여, 소켓을 닫는다.
그럼 아래와 같은 그림이 보이게 된다.

이렇게 HOSTA는 소켓을 닫음과 동시에 입·출력 스트림도 닫아 버리고, 자신에게 가지고 있던, 버퍼부터 시작한 모든 리소르를 운영체제에게 반환해준다.

물론 일반적인 경우에 문제가 되지는 않지만, "어떤 중요한 정보"를 HostB가 전송도중이였다면, 그 정보는 잃어 버리게 된다. 물론 나중에 다시 요청할수 있다면 그때 다시 요청해도 되겠지만 말이다.

만약 그 중요한 정보가 바로 지금 필요한 정보라면, 함부로 소켓을 닫는 행위는 좀 껄그럽게 된다.
그래서 우아하게 종료가 되는 것이 필요한것이다.

요약 : 우아한 종료는 중요한 정보를 보내거나 받는 도중 소켓을 닫지 않기 위해서 필요하다.


그렇다면 2. 우아한 종료란 무엇일까?
그림 하나가 더 좋은 설명을 할수 있어, 그림을 구해왔다.

여기서 보면 알수 있듯이 우아한 종료는 자신의 입·출력 포트 중 자신의 현재 상태에 맞게 한쪽 스트림만 닫는것을 뜻하게 된다.

그러니까~ 만약 내가 중요한 정보를 보내고 있고, 접속을 종료해야 한다면, 중요한 정보를 다 보내고 나서, 출력 스트림만 닫고, "HostB가 무사히 받았어요" 라고 말을 해주면 그때서야 입력 스트림을 닫은 후에, 소켓을 닫아 버리게 된다.

이렇게 중요한 정보를 보내거나 받게 될때, 프로그래머는 해당 정보의 중요성 여부를 판단하여, 소켓을 제어하면 좋을듯 싶다.


우아한 종료를 하기 위한 함수
shutdown(
    IN SOCKET s,
    IN int how
    );

파라메터 S : 대상이 되는 소켓
파라메터 how

이렇게 .. 되어 있다.

그러면 좋은 하루!



신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요