C# 의 shutdown 과 close

IT/C# 2011. 9. 25. 16:09


C# 의 소켓 사용시에 소켓 해제할 때 아래와 같이 코드들을 사용하곤 한다.


sock.shutdown(SocketShutdown.Both)
sock.close()

이 코드의 정확한 의미는 다음과 같다.

일단 소켓에 대해 이해가 필요한데, 소켓은 OS 에 속한 리소스로 여러개의 프로세스를 하나의 소켓 내에서 관리할 수 있다. 

close 가 호출될 때 소켓이 관리하는 핸들이 1개 줄어들게 되며, 이 숫자가 0 이 되면 소켓의 연결이 정상적으로 close 되게 된다. ( 연결된 상대에게 FIN / EOF 가 전달된다 )

주의할 점은 핸들의 갯수가 0 이 되기 전까지는 다른 프로세스가 여전히 소켓의 핸들을 가지고 있기 때문에 연결이 종료되지 않고 소켓은 해제되지 않는다는 것이다. 

shutdown 을 호출하게 되면 현재 연결된 프로세스의 갯수에 상관없이 연결되어 있는 상대방에서 FIN/EOF 를 보내서 연결을 종료하게 된다. 하지만 완전히 소켓이 메모리 상에서 해제된 상태는 아니므로 shutdown 후에는 close 를 해 줘야 한다. 

참고 :  http://stackoverflow.com/questions/409783/socket-shutdown-vs-socket-close
AND