리눅스 소켓 close 관련 질문 드립니다.

zzang3757의 이미지


위 제목 처럼 리눅스 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 하게 되면 "이벤트 발생 "이 출력이 됩니다.
이건 왜 출력이 되는 것인지 궁금합니다

고수님들 조언 부탁드립니다.

zzang3757의 이미지

http://kldp.org/node/3908 이런 글이 있었네요,,

poplinux의 이미지

shutdown() 한 후 close() 하시는게 좋을 겁니다. tcp 통신에서는요.

왜냐면 상황에 따라 close() 가 제대로 안될 가능성이 있기 때문입니다.

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

zzang3757의 이미지

윗분들의 답변으로 close 와 shutdown 차이는 잘 알았습니다. 감사합니다.

그런데 질문2에 대한 내용은 아직 이해가 되지 않네요ㅜ

익명 사용자의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.