소켓을 close해도 사라지지 않는다?

mg2000의 이미지

제가 네트워크 프로그래밍을 공부중인데요.

서버쪽에서 bind -> listen -> accept까지 잘 되고요.

accpet가 되면, thread를 생성해서, 그 thread에서 데이터를 주고 받도록 만들었습니다.

그리고 recv로 데이터를 기다리는데, 0이나 -1이 나오면, close로 소켓을 닫아주도록 했고요.

이렇게 했는데, 소켓을 1000번 이상 열었다 닫았다 했더니, fopen시에 errno = 24가 나오면서,

파일이 열리지가 않는 겁니다.

lsof를 이용해서 확인해봤더니, 소켓을 한번 열고 닫을때마다, 아래 메시지가 하나씩 추가되는데요.

app 30135 root 7u sock 0,5 134869 can't identify protocol

아무래도 소켓이 완전이 닫히지 않은 것 아닌가 하는 의심도 드는데...

close하면 리턴값은 0으로 잘 나옵니다.

fopen은 안되지만, 클라이언트에서 접속을 하면 accept는 또 되네요.

fopen은 계속 안되고...

이런 경우에 뭐가 문제일까요??

nthroot의 이미지

코드를 올려보세용. FD_MAX 인거 같은데..Close 코드에 문제가 있을 것 같네요.
thread 인지 fork인지 구분을 하셔야 해용. fork에서라면 fd가 복사되어서 계속 늘고 있을테니까요.

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

mg2000의 이미지

pthread_create와 pthread_exit를 이용해서 Thread를 만들고 없애고 하거든요.

select를 사용하는 것도 아니고...

그냥 책에 있는 기본 예제를 변형한건데... ㅜ.ㅜ

dorado2의 이미지

pthread_exit로 종료시키는 부분에서 뭔가 문제가 있을 것 같은데요.

cleanup handler를 잘 이용하거나 (pthread_cleanup_push, pthread_cleanup_pop),
detached 형태로 실행해서 thread 종료시 자원을 확실히 닫아주는게 좋을 거 같습니다.

ymir의 이미지

에러 메시지 자체는, 프로세스에 할당된 fd 가 이미 모두 소진되었다는 의미이므로..
getrlimit() / setrlimit() 을 통해 해당 프로그램 내의 fd 갯수를 적절하게 늘려주는 것도..
한시적으로 도움이 될 것 같습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

poplinux의 이미지

app 단에서 close() 를 호출한다고 해도 소켓이 바로 닫히는 것은 아닙니다.

close() 가 호출되면 커널단에 "소켓을 닫으시오" 라는 명령만 내리고 바로 리턴하게 되며 커널단에서는 socket release 단계를 진행하게 되는데 상대방으로부터 정상적인 ack 등이 안오게 되면 될때까지 계속 닫기를 시도하게 되는 것이지요. 그렇기 때문에 소켓을 다룰때는 일반 FD 를 다룰때보다 좀 더 신경을 써 주어야 할 부분이 많습니다. shutdown() 등을 사용하는 이유도 위와 같은 맥락입니다.

이에 대해서는 effective tcp ip 라는 책에 자세히 나와 있으며 회피 방법도 상세히 기술되어 있습니다.

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

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

poplinux의 이미지

그리고, FD 갯수는 환경마다 다르겠지만 질문하신 분의 환경에서는 1024 개일 겁니다.

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

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

skygift의 이미지

일단 아래 명령으로 소켓이 열려있는 개수를 일단 확인하시구요..

netstat -an | grep ESTABLISHED

열려있는게 많다면은 그건 프로그램 로직에서 제대로 소켓을 닫아주지 못한겁니다.

또한 가지 경우는 fopen으로 열고 fclose로 닫지 않고 close로 닫아서 생기는 문제가 있습니다. ㅡㅡ;;

초보자들이 간혹 하는 실수죠....

그럼이만... 도움이 되셨으면 좋겠네요....

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.