TCP 통신에서 정확한 length 전송/받기

webispy의 이미지

안녕하세요.

TCP방식을 통해서 데이터를 주고받으려고 하는데, 궁금한 점이 있어서 질문을 드립니다.

1. 보내는 쪽에서
100 Bytes
200 Bytes
300 Bytes
위의 3개의 데이터를 순서대로 보냈을 경우(각각 send, 총 3번 send 수행)

2. 받는 쪽에서
100 Bytes
200 Bytes
300 Bytes
3개의 데이터를 순서대로 recv 3번으로 받을 수 있나요? (정확히 3번 recv 수행으로 받을 수 있는지)

네트워크 상황에 따라 쪼개져서 전송되거나 하는 상황은 발생하지 않는건가요? 만약 발생한다면 쉽게 해결할 수 있는 방법이 있는지 알고 싶습니다.

vacancy의 이미지


쪼개져서 전송되는 경우도 있습니다.

그래서 애플리케이션 수준에서도 length 같은 정보를
일종의 헤더를 만들어서 전송해주게 되지요. ;;

일단 length만 넘어오면 그 다음부터는
그 length만큼 다 넘어올 때까지 read를 반복하면 되겠죠.

jinyeong의 이미지

TCP에서는 stream을 제공할 뿐이므로 3번 보냈다고 해서 정확히 3번만에 읽을 수 없습니다.

위의 100, 200, 300을 순차적으로 짧은 시간에 보냈다면,

nagle's algorithm에 의해 한번에 받을 확률이 높습니다.

윗분 말씀처럼 length가 포함된 header를 사용하는 경우가 일반적이지만, 이 경우도 정확히

3번만에 읽는다는 것을 보장하지는 못합니다.(header를 읽는 것을 제외한다고 하더라도 말이죠.)

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

jick의 이미지

쉽게 해결할 수 있는 방법... 없습니다.

어렵게 해결할 수 있는 방법도 제가 아는 한 없습니다.

Length를 미리 넘겨주고, 읽는 쪽에서 그만큼 읽어야 합니다.

Read를 두번 (length 때문에 한번, 실제 데이터를 위해 한번) 하는 overhead를 막기 위해서는 buffer를 두고 최대한 읽을만큼 읽은 다음 원하는 length만큼 읽었으면 통과하고 나머지는 다음 번 read를 위해 남겨두는 등의 삽질이 필요합니다.

gamgi의 이미지

ioctl을 사용하면 될 것 같네요..
쪼개져서 전송되어도 버퍼에 차곡차곡 저장이 될테고, 버퍼에 저장된 바이트만 알면,
recv를 정확히 3번 콜할 수 있을 것 같네요..
물론 저는 그렇게 안씁니다. 윗분들 얘기처럼 보낼 데이터 길이와 ioctl을 같이 쓰죠.. ^^;

skminho의 이미지

먼저 length의 길이를 전송 해준다고 했는데

unsigned short recv_lens; //받을 데이터 길이 저장 버퍼

memset(&recv_buff,0x00,sizeof(recv_buff));

recv(inet_sock,recv_lens,2,0);
recv(inet_sock,recv_buff,recv_lens,0);

위와 같은 방식으로 받으면 되나요??

클라이언트는
send(clnt_socket,strlen(snd_buff),2,0);

send(clnt_socket,snd_buff,strlen(snd_buff),0);
이렇게 구성하였습니다.

근데 제가 send_buff에 "1111csm001"으로 초기화 해놓고 보냈는데.

59라고 나오네요.ㅠ.ㅠ 아시는분 리플좀 부탁 드릴게요

댓글 달기

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