티스토리 뷰

소켓으로 통신을 하다가 통신을 끝내고 싶을 때 소켓을 종료해야한다.

소켓을 종료하는 방법은 두가지가 있는데

 

int close(int socket_fd);

int shutdown(int socket_fd, int how_to);


이 있다.


위 두가지 함수의 사용법과 차이점에 대해 알아보자


TCP소켓은 통신의 신뢰성을 유지하기 위해 패킷을 주고받을 때 마다 안전하게 수신했다는 신호로 ACK패킷을 재전송한다. 이는 소켓을 종료할 때도 마찬가지이며 클라이언트에서 종료 패킷을 보내면 서버는 이에 따른 ACK패킷과 종료 패킷을 보낸다. 서버가 보낸 종료 패킷에 대해 클라이언트도 ACK패킷을 전송하면 정상적으로 소켓이 종료된다.




close()


int close(int socket_fd);


성공하면 0을, 실패하면 -1을 반환한다.

close()함수는 매개변수로 전달된 socket_fd 소켓의 참조 카운터를 1 감소시키며 참조 카운터가 0이 되면 해당 소켓을 종료한다.

소켓을 종료하면서 동시에 recv buffer와 send buffer를 차단하기 때문에 close함수를 통해 소켓이 종료되고 난 시점 이후 부터는 더이상 통신을 주고받을 수가 없다.






shutdown()


int shutdown(int socket_fd, int how_to);


마찬가지로 성공하면 0, 실패하면 -1을 반환한다.

shutdown 함수는 close와 마찬가지로 소켓을 종료하지만 두번째 매개변수인 how_to에 어떤 값을 넣느냐에 따라 read buffer와 write buffer를 차단할지 선택할 수 있다.


how_to 상수


SHUT_RD : recv buffer 만 차단한다.

shutdown(s, SHUT_RD);   

위처럼 호출 된 경우 더이상 해당 소켓으로 부터 통신을 수신할 수 없다.


SHUT_WR : send buffer 만 차단한다.

shutdown(s, SHUT_WR);

위처럼 호출 된 경우 더이상 해당 소켓(s)에게 송신을 할 수 없다.


SHUT_RDWR : 두 버퍼 모두 차단한다.

shutdown(s, SHUT_RDWR);

위처럼 호출 한 경우 더이상 해당 소켓과 송수신을 할 수 없다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함