소켓 프로그래밍 관련 질문입니다.

익명 사용자의 이미지

소켓 프로그래밍을 입문해서 이제 막 공부를 시작했는데요,
궁금한게 생겨 이렇게 질문 드립니다.

TCP/IP를 이용하면 신뢰할 수 있는 데이터 전송이 보장되고,
Application level에서 프로그래밍을 할 때 서버와 클라이언트 간 프로토콜을 정의해야 한다고 배웠습니다.

만약 클라이언트에서 write(sock, buffer, 100);과 같이 데이터를 전송하고
처음 10 바이트에 헤더 정보가 있어서
서버에서 read(sock, buffer, 10)과 같이 헤더 데이터를 먼저 받는다고 할 때에

이렇게 read로 데이터를 읽는다고 하면 서버쪽 socket 버퍼에 클라이언트에서 보낸 데이터가 10바이트 이상 들어왔다는 가정이 있어야 하는데
이런건 따로 확인 안해도 되는건가요? 만약 아직 5바이트만 들어왔는데, read(sock, buffer, 10)이 호출되면 5바이트만 들어올텐데 이런 경우도 대비해서 코딩해야겠죠?

보통 서버, 클라이언트 간 통신을 할 때에 사용하는 방법이 궁금합니다...(제가 소켓 프로그래밍이 처음이라 정말 기본적인게 헷갈리네요ㅜ)

결과적으로 클라이언트에서 보낸 100바이트가 모두 도착하긴 할텐데 그 시점이 제게 미묘하게 다가옵니다...

두서없는 글이되었는데, 혹시 아시는분 계시면 답변 부탁드립니다.

익명 사용자의 이미지


일단 헤더가 10으로 고정이라고 한다면요. read가 아니라 recv()를 확인해보세요. 제일 마지막 인자에 flags 설정이 있습니다. 거기에 MSG_WAITALL을 설정하면 10바이트 모두를 받을 동안은 함수 리턴을 하지 않습니다. 이런식으로 헤더를 모두 받는 것을 보장하고, 그 헤더 정보 기반(헤더에 데이터 사이즈가 있어야 겠지요)으로 나머지 데이터를 받을 수 있도록 구현하시면 됩니다.

익명 사용자의 이미지

제가 아직 recv()까지는 진도를 안나가서 몰랐던 거군요!
조금 더 성실하게 배워보도록 하겠습니다.
답변 감사드립니다.

댓글 달기

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