[질문]소켓 통신에서 recv에서 막히네요..

익명 사용자의 이미지

안녕하세요..

소켓통신으로 코드를 짜다가 막히는게 있어서 글을 올립니다...

클라이언트에서 서버로 구조체로 작성된 데이터를 던지면 서버에서는 그
걸 토대로 계산을 한 후에 똑같은 구조체로 응답을 해주는 형식입니다..

클라이언트와 서버에서 소수의 데이터는 전송이 잘 되는데요...

테스트를 위해서 다량의 데이터를 for문을 이용해서 돌려버리면 어느정도
통신이 되다가 block되어 버립니다...

혹시나 버퍼크기때문에 그런줄 알고 setsockopt에서 버퍼 사이즈를 조정
을 해도 마찬가지더군요...

모자란 실력에 쭈욱 따라가봤더니 클라이언트에서 recv 하는 부분에서
block이 걸리는것 같았습니다...

관련 옵션을 읽어봐도 반은 알겠는데 나머지는 도통 무슨소린지 헷갈려서
마지막으로 이렇게 질문 드립니다...

고수님들의 답변 기다리겠습니다..

익명 사용자의 이미지


소스도 없이 너무 간략하게 질문하셨네요.
이럴 경우에는 '다시 한번 관련서적이나 문서들을 찾아보고, 잘못된 곳이
없는지 꼼꼼히 살펴보세요. tcpdump나 netstat으로 소켓의 상태를 살펴보
보시고요. strace, truss, tusc 같은 시스템콜 추적 함수를 이용해서 블록
된 상황을 다시 모니터링해 보시고요. lsof로 파일정보도 한번 보시고요'
정도의 답변 이상이 힘들 듯 합니다.

recv에서 block되어 있고 데이터를 계속 전송해도 안 깨어나나요?

흠...

익명 사용자의 이미지

데이터를 한꺼번에 왕창 보내게 되면 send하는데선가 recv하는데서 먹통
이 됩니다.
(넘 오래되서 어디서 먹통되는지는 한번해봐야 하는 통에...^^
느낌으로는 send쪽 같은데...)

socket통신을 할때는 되도록이면 패킷을 작게 잘라주는게 좋습니다.
MTU가 보통 1500정도일텐데 이것땜에 좀 애매하죠....

큰 데이터를 날리고 싶을 경우 보통 자기 나름대로의 헤더를 만들고
데이터를 적당크기로(저는 1024로 보통합니다) 쪼개서 보내고 받는쪽에서
재조립하는 형태로 프로그램을 짭니다.

일단 소스를 봐야겠으나 대충 이런 문제같고요.

호스가 좁은데 물을 왕창 넣으면 잘 안나가겠죠....^^

한번 tcpdump랑 패킷을 찍어보던가 netstat으로 현재 소켓의
상황을 한번찍어보세요.

그럼....

익명 사용자의 이미지

일단 단서는 소수의 데이타에서는 않 막히고 잘 되다가,
왕창 퍼부으면 데이타가 막혀서 recv에서 멈춘다...뭐 이런거겠죠?

사실, 왕창 퍼부으면 recv에서 막힐 수 밖에는 없습니다.

데이타 처리능력이 확실히 차이나는 시스템에서 socket buffer size를 조
정을 해도 가령 총계 Tera Byte쯤 되는 데이타가 쏘아지면 결국 buffer
pool이 나는 것은 당연한 겁니다.

그러니 원칙적으로는 데이타가 가면 받는 쪽에서는 잘 처리 되었다는 신
호를 보내고 그 신호를 받은 보내는 쪽에서 다음 데이타를 보내고...

뭐 이런식으로 처리를 해야만 안전하다고 볼 수 있습니다.

댓글 달기

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