iocp로 간단한 서버 만들고 네트워크관련 질문입니다.

dionysos의 이미지

iocp에서 통신규약을 6byte HEADER

나머지를 data로 취급하며 길이는 가변입니다..

물론 해더에 테이터 길이 필드가 있습니다.

여기에서 질문인데요 클라이언트에서 data를 10byte를 보냈는데

서버쪽에서 읽을때 10byte이하가 읽히는 이런경우가 있나요?

읽힌다면 이런경우가 있다면 어떻게 처리를 하는게 좋을까요.

여러번 읽어서 조합해야하나요?

lovemyin의 이미지

IOCP를 사용하셨다면 비동기적으로 데이터를 읽으실텐데...
스래드에서 데이터를 처리하게 되어있을겁니다.

원래 TCP라는 놈이 스트림 방식으로 되어있기때문에 정확히 보낸 메시지를 내가 한번에 읽을수 있다는 보장은 전혀없습니다.

따라서 먼저 해석하신 데이터 길이를 이용하여 여러번 읽어서 데이터를 조합하는 방법이 좋을것 같습니다. 실제적으로 그렇게 구현되어 있는 경우도 많고요.

데이터 10bytes 정도는 보통 한번에 읽을 가능성이 매우 큰데... 계속 그런 현상이 발생하면 클라이언트에서 제대로 메시지 전송을 하였는지도 체크해 보세요..

하지만 원칙적으로 TCP 스트림 방식입니다. 언제나 정확히 한번에 읽는다는 보장은 없습니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

frowt의 이미지

10byte 이하가 읽히는 경우는 있고요..
반복해서 읽기는 읽어야 하는데,
looping 돌면서 recv 하는게 아니라
recv event 가 발생되었을때 recv를 하여야 겠죠.

dionysos의 이미지

네트워크를 통해서 정해진 크기를 받을때까지 기다린다면

만약 header에 정해진 길이보다 더 많이 받았을경우는 어떻게 하

나요

예를들어 1Byte 해더에 를 사용한다면 처음대기시간에 3Byte를

받고 해더를 분석해보니 길이가 20Byte라는걸 알았습니다.

남은 17Byte를 받기위해 계속 기다리고 있는데 19Byte의 테이타

가 왔다면 이 패킷은 폐기하는게 옭은 일인가요 아니면 먼저번에 왔

던 3Btyte와+ 17Byte를 합쳐서 처리를하고 2Byte를 다른 명령

어의 data로 인식하고 하고 2Byte에서 header로 인식하여

다시 해더에 정해진 길이만큼 받을때까지 기다려서 처리하는게 옳

을까요

ㅡ.ㅡ. 제가 써놓고도 읽보니 횡설수설하는듯..

만약에 최악의 상황을 가정한다면 클라이언트에서 테이타를 보냈는

데 서버에서는 클라이언트가 하나 보냈다는것을 인식하기도 전에

같은 클라이언트가 다시 테이타를 보냈다면 서버 입장에서는

명령어1Header+data + 명령어2Header + data이렇게되거나

명령어1Header+data + 명령어2Header + data일부

이런경우를 말합니다.

노력은 배반하지 않는다.

익명 사용자의 이미지

합쳐서 처리하세요. 당연히 버리면 안됩니다.
데이터 전송에 문제가 발생하면 크리티컬한 문제가 발생시에는
connection을 종료시켜버리는게 좋습니다.

위와 같은경우는 로드가 걸릴때 자주 발생합니다.
계속적으로 읽어서 처리하세요. 헤더 읽고 데이터읽고 모잘라면
기다리고... 서버프로그램의 일반적인 루틴입니다.

dionysos의 이미지

그렇군요.. 저도 그런쪽으로 생각하고 있었는데요.

아는사람이랑 이야기하는데 버러야 된다는식으로 이야기 해서요..

감사합니다.

노력은 배반하지 않는다.

simpid의 이미지

iocp는 IO Completion Port 의 약자란건 알고 계실것 같은데요.

그러니까 질문의 전제 조건이
Client에서 10Bytes를 보냈는데 server에서 10Bytes 미만으로 받는경우...

iocp에선 이런 경우는 없습니다.
iocp를 이용하면 io 요청을 하면 해당 요청이 완료 됐을때 port를 통애 결과를 통보받게 됩니다.
그러니까 client에서 몇바이트를 보냈냐가 중요한게 아니고...server에서는 10Bytes를 받겠다고 했을테니까.. 10Bytes가 받아지기 전까지는 완료 통보가 도착하지 않는거죠.

iocp와 select등의 전통적인 방법은 개념이 다른거죠.

dionysos의 이미지

그래도 서버가 과부하로 io를 처리하지 못하는 상태에 있고 클라이언트에서

data를 여러번 보낸다면 그럴수 있찌 않나요.

아무 문제가 되지 않는건가요.. 궁금합니다.

노력은 배반하지 않는다.

kihongss의 이미지

dionysos wrote:
그래도 서버가 과부하로 io를 처리하지 못하는 상태에 있고 클라이언트에서

data를 여러번 보낸다면 그럴수 있찌 않나요.

아무 문제가 되지 않는건가요.. 궁금합니다.

data를 전송할때도 원하는 길이 만큼 전송했는지 검사해보세요.

Quote:
Effective TCP/IP Programming : 44 Tips to Improve Your Network Programs

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