[완료][질문] 소켓 프로그래밍에서 write()와 read()가 1 : 1 이 아닌가요?

sDH8988L의 이미지

안녕하십니까...

지금 소켓 프로그래밍을 처음 하고 있는데요...

흠... 파일 Upload / download 부분에서 좀 이해 안가는 문제가 있네요...

write() / read() 로 upload / download를 구현하고 있는데, 이게 1 : 1 대응이 아닌가요?

달리 말하자면, 100M 짜리 파일은 1K 단위로 보내는데, 만일 1 : 1 대응이 아니라면, 보내는 측에서야 언제 파일이 끝나는 지는 알 수 있겠으나 받는 쪽에서는 알 수 없는 것 아니겠습니까?

Test를 하나 해 봤는데, write()를 Loop를 돌면서 100 x 1024번 할 때, read()는 그 수 만큼 실행되지 않습니다... 대체적으로 더 많이 실행 되더군요... 정확히 1K씩 받는 것도 아니고 덜 받을 때가 많아서 전체적으로 write() 보다 read() 실행 수가 많습니다...

이러면, 언제 upload가 끝나는지 알 수 없는 거 아닐까요?

처음 생각은 보내는 측에서 어떤 종료 Message를 보내서 그걸 받는 측이 받으면, download loop를 빠지는 걸로 설계햇었는데요...

그 종료 Message가 그 이전의 Data Message랑 섞여 버리더군요... 이걸 어찌 해야 하는지...

아시는 분 계시면 좀 답변 부탁드리겠습니다...

kslee80의 이미지

자세한것은 TCP 를 이론적으로 알아보시면 자세히 알 수 있을 것입니다..

질문하신 상황과 같은 경우에는,
보통 파일을 보내는 측에서 파일의 사이즈를 먼저 보내고 실제 데이터를 보내는
방식으로 많이 구현합니다.

sDH8988L의 이미지

감사합니다...

가르쳐 주신 방법으로 파일 Upload를 구현하였습니다...

이 문제로 Class Project를 못 할 위기에 있었는데, kslee80님 덕분에 살았습니다...

다시 한 번 감사드립니다...

혹 또 모르는 일이 있으면 종종 질문 드리겠습니다...

powerson의 이미지

sDH8988L wrote:

write()를 Loop를 돌면서 100 x 1024번 할 때, read()는 그 수 만큼 실행되지 않습니다

write와 read는 1:1 매칭이 아닙니다. read 했을 경우에 return값은 해당 buffer에 실제로 read한 양의 값을 return하도록 되어 있는 이유가 바로 이러한 부분을 체크하라고
값을 return해주는 것입니다. 실제로 1024 buffer를 사용하셔서 read를 한다고 하더라도, 100% 1024를 항상 receive 하지는 않습니다. 이보다 적은 데이터를 return할 가능성은 충분히 있음을 생각하셔야 합니다. 단, recv()에서 flag에 MSG_WAITALL 이라는 option을 사용하시면, 원하시는 기능을 사용가능하니 manual page를 확인하시면 될거 같습니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

sDH8988L의 이미지

흠... 그렇군요...

소켓 프로그래밍을 이제 시작하다 보니 모르는 게 많습니다...

가르쳐 주신 recv() option을 사용해 보았습니다... 잘 동작하는 군요...

많은 걸 배웁니다...

감사합니다...

댓글 달기

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