Close와 Shutdown, 둘 다 Socket을 닫고 통신을 종료하는 함수이다. 차이점은 소켓을 닫는 방식에 있다.
소켓을 닫고 통신을 종료하는 함수다. 매개변수는 닫을 소켓이다.
성공하면 0을, 실패하면 -1을 반환한다.
내부적으로는 소켓에대한 참조카운트를 1감소하고, 참조카운트가 0이 되면 소켓을 닫는다. 만약 당신이 다중스레드 서버에서 close를 사용할 때, 이 참조카운트를 신경써야한다. 게임서버는 대부분 recv한 후에 send하는 에코서버가 아니기에(recv없이 send할 수 있다), 언제든지 참조카운트가 2이상이 될 수가 있다.
만약 참조카운트가 2이상이라면, 소켓을 close하고 나머지 작업에대한 실패 통보를 받고 참조카운트가 0이 되었을 때에 connect 객체를 삭제해야한다. (자세한 설명은 1을 참조)
참조카운트가 0가 되어 socket이 닫힐 때, recv buffer와 send buffer에 차단시켜서 더이상 소켓의 사용이 불가능하다.
사족으로, close가 참조카운트를 -1을 시킨다는건, 반대로 open은 참조카운트를 1을 늘린다는 말인 것같은데, 그럼 open은 소켓에 연결한다는 말이 아니라는 것같다.
close와 동일하게 소켓을 닫고 통신을 종료한다. 성공하면 0을, 실패하면 -1을 반환한다.
sockfd는 닫을 소켓이며, howto는 참조카운트와 관계없이 소켓을 닫는 방식을 정할 수 있다.
close 함수의 단점인 경우가 하나 더 있는데, close후에 단방향을 사용할 경우이다. 그런 경우가 뭐가 있는지는 모르겠지만
즉 소켓은 닫혔지만, recv buffer나 send buffer중 하나에 접근할 수 있는 권한을 남겨두어 계속 통신이 가능하다. 물론 둘 다 닫을 수 있다.
howto의 값은 다음과 같다.
SD_RECEIVE: recv buffer 만 차단한다.
SD_SEND : send buffer 만 차단한다.
SD_BOTH : 두 버퍼 모두 차단한다.
전역도 다와가니, 포트폴리오 제작중인데 기억이 조각나버려서 하나씩 생각날 때마다 정리해야겠다.
댓글,
Lowpoly
게임 서버 프로그래머 지망생