TCP기반의 연결 종료 방법 ------------------------------------------------------------------------------------------


int closesocket(

  _In_  SOCKET s -> 연결을 종료하고자 하는 소켓을 인자로 넘긴다.

); -> 성공시 0반환 실패시 SOCKET_ERROR반환

소켓의 연결을 종료하기 위한 closesocket 함수의 호출은 완전종료를 의미한다.

말그대로 묻지도 따지지도 않고 그대로 호출한 쪽의 소켓을 완전히 끊어 버리는 것이다.

이는 현재 전송되고 있던 데이터까지 소멸시키면서 연결을 종료시킨다는 것을 의미한다. 즉 통보나 뭣도 없이 갑자기 연락을 끊어버리기 때문에 어떤 오류가 생길 수도 있는 것이다.


이를 막기 위해서 TCP기반 종료함수로 다음과 같은 함수가 존재한다.


int shutdown(

  _In_  SOCKET s, -> 연결을 종료하고자 하는 소켓을 입력

  _In_  int how -> 종료 방법에 대한 플래그 전달.

); -> 성공시 0 실패시 -1 반환.


첫번째는 이해가 가지만 두번째인자값은 쉽게 이해가 가지 않을 것이다.


전에 이야기 했던 입출력 스트림을 한번더 보자.

하나의 소켓은 입력버퍼와 력버퍼를 가지고 있다. 이 버퍼들은 입출력스트림을 생성한다.

여기에서 소켓을 닫는다는 것은 두개의 버퍼를 모두 정지시킨다는 이야기이다.

하지만 두개를 개별적으로 닫을수 있다면? 그리고 데이터 처리가 완전히 끝나면 닫을 수 있다면?

그러기 위해서 존재하는게 shutdown함수다.


두번째 인자값으로 넣을 수 있는 파라미터는 다음과 같다.

SHUT_RD -> 입력스트림을 종료한다.

SHUT_WR -> 출력스트림을 종료한다.

SHUT_RDWR -> 입출력스트림을 종료한다.


Half_close ------------------------------------------------------------------------------------------

위에서 나온 인자값으로 하나씩 스트림을 닫는것을 하프 클로즈라고 한다. 여기에서 위의 인자값의 의미를 파악해보자.


SHUT_RD -> 입력스트림을 종료한다. 단 데이터가 입력버퍼에 전달되어도 그냥 지워버릴 뿐만 아니라. 입력 관련 함수의 호출도 허용하지 않는다.

SHUT_WR -> 출력스트림을 종료한다. 단 출력버퍼에 데이터가 남아있다면 그 데이터를 출력시키고 스트림을 종료한다.

SHUT_RDWR -> 입출력스트림을 종료한다. 단 위의 RD와 WR을 순차적으로 실행한다.


윈도우에서는 ------------------------------------------------------------------------------------------

윈도우에서도 동일한 셧다운 함수가 존재하지만 다음과 같이 두번째 인자값에 차이가 있다.

SD_RECEIVE -> SHUT_RD의 역할을 한다.

SHUT_SEND -> SHUT_WR의 역할을 한다.

SD_BOTH -> SHUT_RDWR의 역할을 한다.







Posted by JJOREG