소켓으로 데이터 전송시 문제점

renige의 이미지

안녕하십니까..

TCP 소켓으로 한 5M정도를 1024씩 잘라서 보내려고 합니다. 1024크기 패킷의 처음한 바이트는 패킷타입으로 사용하여 이 값을 보고 패킷을 처리합니다.

그런데 아무런 delay없이 보낼 경우, 처음에 10개정도는 패킷타입이 제대로 된 값이 들어가는데, 그 이후 부터 패킷타입값이 다른 값이 들어갑니다.
그래서 delay를 주고 보내면 제대로된 패킷값이 제대로 들어가서 받는 측에서는 제대로 받고 처리합니다.
select를 이용하여 소켓에서 데이터를 받았을 경우 처리합니다.
보내는 측은 출력해봐서 아무런 이상이 없는 상태입니다.
받는 측에서 처리하는 시간동안 패킷을 받지 못하는 것 같습니다.
이 문제점을 해결할 방법을 알고 싶습니다.

수고하십시요

bbok의 이미지

정확한 원인은 올려주신 정보로만은 판별이 불가능한것 같습니다.
추측을 하나 하자면, read, write할때 데이터 전송 량을 제대로 체크하지
못해서 생기는 문제인것 같습니다. 직접 코드를 봐야 알겠지만
왠지 그런느낌이 드는군요.

즉, write할때 write(fd, buff, 1024)라고 하여도 정확하게 1024바이트가
write되는것은 아니기 때문에 얼마를 write하였는지 check하여 나머지를
subtract해서 다시 보내야 하지요.

고속으로 보내면 문제가 생기고 그렇지 않으면 문제가 생기지 않는다고
하시는걸 보니, 왠지 그런것 같습니다. 커널 버퍼가 꽉차면 무조건 유저영역의
데이터를 받아들일수가 없으니까요. 확인해보시고 그것도 아니라면
좀더 많은 정보를 주셨으면 하네요 ^^

그럼 즐거운 하루되세요~

@.@ 어제처럼, 오늘 처럼, 내일 처럼.

zeshai의 이미지

흔히 생각하기에 주고 받고, 주고 받고 하면 잘 되겠지라고 생각하시지만...

그렇게 네트워크 전송은 신뢰도가 높은것이 아니더군요.

자신만의 프로토콜을 디자인해서 적어도 structure로 제대로 온 값인지를

구별할 수 있는 변수를 하나 두는 것이 좋습니다.

또한 윗분이 적으신것 처럼....

넘겨준 사이즈 만큼 제대로 받았는지도 잘 확인해야합니다.

명시적으로 잘 왔으면 왔다고 메세지를 보내주고 아니라면 다시 받고...

이런식으로 하면 그나마 잘 되더군요...

버퍼의 관리와 사이즈의 측정이 아주 중요한것 같습니다.

별로 도움이 되지 못한것 같군요.. :-)

pebiman의 이미지

수신 쪽에서 아예 데이타를 못 받는 다는 소리이신가요?
아니면, 받긴 받는데, 잘 못 받는 것 같다는 말씀이신가요?

쓰레기는 쓰레기통에...

whenicu의 이미지

우선 TCP/IP 전송은 신뢰할만 합니다 ^^;

테이터수신부가 Windows의 경우에는
페킷크기나, 넷웍상황에 따라
fregmet 발생합니다.

Queue로 구성하셔서.. 데이터를 어느정도
조립하셔야만 정확한 데이터를
받으실수 있으실 것 같습니다.

zeshai의 이미지

제가 말한 신뢰성 얘기는 그냥 책으로만 공부한 사람들이 실제 구현을 했을때...

느낌을 얘기한 것입니다.

물론 저도 포함되지요...

TCP/IP가 어느정도의 신뢰성도 없었다면...

저희가 여기서 이렇게 얘기를 나누고 있진 않겠죠? ;-)

myroot의 이미지

똑같은 질문을 몇주전에 누구한테 들었는데....^^

제 생각은 맨 윗분 말씀대로 tcp버퍼가 넘처서 write를 다 못한것 같기도 하고... 아니면.. recv하실때... 실수 하신것 같군요...

여기를 참고해보세요.
http://abyss.jaram.org/wiki/wiki.php/EffectiveTcp/ipProgramming#s-1.6

이팩티브 tcp/ip프로그래밍 책보면서 정리한건데 저 부분을 보면 도움이 되실것 같네요.

댓글 달기

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