tcp/ip 공부 도중 eof 전송에 대한 이해가..

junku901의 이미지


c언어로 tcp/ip 네트워크 프로그래밍을 공부하고 있는 학생입니다

현재 사용하고 있는 교재에서 파일전송하는 프로그램을 만드는데

클라이언트가 파일의 끝을 어떻게 알지 판단할때 서버의 출력스트림을 종료해서 클라이언트에게 EOF 를 전송하는 방식을 이용하고 있습니다

그런데 여기서 궁금한것이 있는데 정말 서버의 출력스트림을 종료할때 클라이언트에게 EOF가 전송되고 그래서 read함수가 0을 반환하는 것으로

파일의 끝을 구분한다면 파일내에 EOF와 같은 바이트열이 포함되어 있을땐 어떻게 되는 것인가요? 그러면 출력스트림이 닫히기 전에

파일내에 있는 EOF와 같은 바이트열이 전송되서 클라이언트의 read함수는 아직 파일전송이 완료되지 않았는데도 0을 반환하게 되지 않나요?

음.. 약간 좀 기초적인 질문같긴 한데

만약에 서버에서 파일전송의 끝을 알려주기 위하여 클라이언트에게 어떤 바이트열을 마지막에 보낸다 하든 파일내에 그 바이트열과 완전 동일한

바이트열이 존재한다면 문제가 되지 않나요?

그리고 이것에 대해 생각하다보니 클라이언트의 read함수가 EOF를 수신했을때 0을 반환한다면

서버에서 데이터를 보내다가 우연히 클라이언트에게 EOF 와 같은 바이트열을 보내게 된다면 기대했던것과 다른 동작이 나타나지 않지 않을까 하는 궁금증이

계속 꼬리에 꼬리를 물고 나오네요..

고수님들의 많은 도움 부탁 드립니다..ㅠ

익명 사용자의 이미지

예를들어,
출력 스트림을 종료하면 tcp연결이 끊어질 겁니다.
그러면, read함수는 0을 반환합니다.
이것은 연결이 끊어졌는데, (아마도)상대방이 종료한거야..라는 의미입니다.
데이터를 수신했는데 그게 EOF다... 라는 의미가 아니죠.
대이터를 수신했으면 반환값은 0보다 큰 값이겠죠.
데이터를 다보내면 출력스트림을 닫기로
미리 약속(?)했으므로 데이터를 다 받았다고 치는(?)거죠.

그리고 교제에서 설명하고 있는 방식이 유일한 방식은 아닙니다.

익명 사용자의 이미지

글쎄요
EOF 를 임의로 집어넣으셨다는 말씀으로 들립니다.
커널 tcp/ip 에서는 MSS(이건 그냥 주고 받는 매 데이타블럭 최대길이인데 tcp/ip 상세는 간단치가 않아서요) 가 정해지고 상대 윈도우 크기에 따라 몇개의 블럭을 보내고 ACK 가 오기를 기다리고 받으면 다음 순서번호 몇개 보내고 합니다.
그리고 바이트열로 계산하지 문자열로 취급하지 않습니다.

댓글 달기

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