[질문] 리눅스 소켓 프로그래밍에서 기현상...

splendor의 이미지

리눅스에서 소켓프로그래밍에서 다음과 같은 기현상이 있습니다.

소켓을 통해 서버에 접속하는 프로그램입니다.

서버에 접속해서 통신하고 소켓 닫는 것을 반복합니다.
하나의 프로그램에서 똑같은 통신작업이 계속 반복됩니다.

그런데 어떤 상황이 발생하냐면...

서버에 접속해서 통신하는 함수를 여러번 실행시키는데요...

첫번째 접속에서는 잘되고 연결을 종료합니다.
두번째 접속에서는 timeout이 걸려버립니다.
connect 함수에서 블로킹이 되어 있다가 약 3분 10초정도 후 timeout이 발생합니다.
그후 세번째 접속부터는 항상 모두 잘 됩니다.

접속하는 서버 주소, 포트, 주고받는 메시지는 모두 동일합니다.

프로그램을 몇번 실행시키건 간에 항상 두번째 접속시도에서 timeout이 발생합니다.

혹시 이와같은 상황을 경험해 보신 분 계신지요?

서버측 구현에 문제가 있는 것 같지는 않습니다.
여러 웹서버 80port들(다음이나 야후 같은 곳)에 접속하는 테스트를 해봤는데 증상이 동일하거든요.

사정상 소스코드는 올릴 수 없습니다. ㅡㅡ;;
소스코드에 문제가 있을 가능성은 많지 않습니다.
소스코드보다는 외부적인 요인이 있는 것이 아닌지 궁금합니다.

la9527의 이미지

혹시 프로그램이 쓰레드 형식으로 돌고 있는 것인지요?

접속하는 서버에 socket close를 잘 하고 있는 것인지 궁금하네여..

소스가 없으니 모라고 답변드리기가 참으로 애매합니다.

참 한가지 더 netstat -nap 로 소켓이 제대로 물고 있는지 살펴 봐야보시구여..

마지막으로 strace를 걸어봐서 내부적으로 패킷이 잘 가고 있는지 살펴 볼수 있겠네요.

그리고, 제가 어떤곳에서 테스트 해보니.
connect된 세션을 몇개까지만 허용하는 곳도 있었고,
파이어월에서 30분동안 아무데이터도 오가지 않으면, 허용하지 않는 그런 곳도 있었습니다..

좋은 답변 되지 못했네여.. ^^; 그럼 수고하세요..

saxboy의 이미지

서버가 select/no fork 기반인가요?

pynoos의 이미지

strace 로 일단 소켓이 제대로 close되는지 확인해보세요.

splendor의 이미지

서버측 구현 상황은 알 수 없구요.

일반적인 웹서버들에 붙여서 테스트 중입니다.
다음이나 야후 같은 곳이요.

그리고...
strace는 옵션을 어떻게 줘야하나요...?? ㅡㅡa

김충길의 이미지

PID를 안다면 strace -p <PID> 주세요

자세한건 man strace

screen + vim + ctags 좋아요~

익명 사용자의 이미지

소스를 공개할 수 없다면, 그리고 소스상의 문제가 아니라고 생각되신다면 간단히 접속만 하는 부분만을 떼어서 문제가 발생하는 경우를 보여주는 것은 어렵지 않을텐데요.

소스는 이상이 없고, 공개할 수 없다. 뭐가 문제~게~. 날 잡아 봐~라~ 하는 식은 여러모로 좋지 않아 보입니다.

splendor의 이미지

임베디드 환경에서 돌아가는 리눅스용 Sun 자바 버추얼 머신의 소스코드입니다. 이미 검증된 코드라는 거죠. 그리고 라이센스가 걸려있어서 공개하기는 곤란합니다.

저도 질문하면서 참 난감합니다. T_T

splendor의 이미지

netstat으로 살펴본 결과는 SYN을 보낸 상태에서 블럭킹이 되어 있는 상황이네요.

하나의 프로그램에서 똑같은 코드를 계속 실행하는 것인데, 왜 하필 두번째 시도에서만 timeout이 걸리는지 참 아리송하군요. T_T

댓글 달기

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