리눅스 소켓 close 관련 질문 드립니다.
위 제목 처럼 리눅스 C 소켓 API 중 close 에 관하여 질문을 드리려합니다..
질문 1> close(n); 와 shutdown(n, SHUT_RDWR); 이 두개는 동일하게 봐야하는 것인가요 ?
질문 2>
테스트용 코드를 아래처럼 만들어봤습니다.
int nRet = epoll_wait( ~ );
for (int i = 0; i < nRet; i++)
{
if (서버소켓 == 이벤트 소켓)
{
int nSocket = Accept( ~ );
epoll_add( ~ ); // 연결된 소켓을 epoll 에 추가
close(nSocket); // Accept 한 소켓을 close 로 바로 종료 !
}
else
{
cout << "이벤트 발생 " << endl;
}
}
여기서 질문을 드리고자 하는 부분은 연결된 소켓을 Epoll 이벤트로 등록시킨후 바로 close 하게 될경우
epoll 이벤트가 발생하지 않습니다. ( epoll_del 로 이벤트 풀에서 삭제 하지 않았는데,, )
그러나 close 대신 shutdown( ~, SHUT_RDWR ) 을 사용하면 "이벤트 발생 "이 출력이 됩니다.
close 로 할떄와 shutdown 으로 할때 차이점이 무엇인지 궁금합니다..
그러나 accept 후에 close 하지 않고 다른 쓰레드를 하나 생성하여 그 쓰레드 안에서 해당 소켓을 close 하게 되면 "이벤트 발생 "이 출력이 됩니다.
이건 왜 출력이 되는 것인지 궁금합니다
고수님들 조언 부탁드립니다.
http://kldp.org/node/3908 이런
http://kldp.org/node/3908 이런 글이 있었네요,,
shutdown() 한 후 close() 하시는게
shutdown() 한 후 close() 하시는게 좋을 겁니다. tcp 통신에서는요.
왜냐면 상황에 따라 close() 가 제대로 안될 가능성이 있기 때문입니다.
========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux
임베디드 리눅스 관련 프리렌서 지향
윗분들의 답변으로 close 와 shutdown
윗분들의 답변으로 close 와 shutdown 차이는 잘 알았습니다. 감사합니다.
그런데 질문2에 대한 내용은 아직 이해가 되지 않네요ㅜ
zzang3757님이 스스로 링크걸어주신 게시물을 읽어보면
close할 때에는 레퍼런스 카운트가 0이 될 때에만 socket connection을
끊고, 이와 달리 shutdown 함수는 레퍼런스 카운트랑 상관없이 무조건
연결된 connection을 끊어버린다는 답변이 있는데요. 이게 사실이라면
close시 이벤트가 발생하지 않는 이유는 아마도 레퍼런스 카운트가 0이
되지 않았기 때문인 것으로 보여집니다. 혹시 fork에 의하여 다른 프로세스가
소켓을 물고있는것은 아닌지 의심되는군요.
추가적인 답변...
epoll의 man 페이지에 보면 파일 디스크립터가 완전히 close 될 때 epoll에 등록되어 있는
디스크립터의 set에서 자동으로 삭제해준다는 내용이 있네요. 아래 링크의 Q6를 참고하세요.
http://man7.org/linux/man-pages/man7/epoll.7.html
댓글 달기