iocp에서 통신규약을 6byte HEADER
나머지를 data로 취급하며 길이는 가변입니다..
물론 해더에 테이터 길이 필드가 있습니다.
여기에서 질문인데요 클라이언트에서 data를 10byte를 보냈는데
서버쪽에서 읽을때 10byte이하가 읽히는 이런경우가 있나요?
읽힌다면 이런경우가 있다면 어떻게 처리를 하는게 좋을까요.
여러번 읽어서 조합해야하나요?
IOCP를 사용하셨다면 비동기적으로 데이터를 읽으실텐데... 스래드에서 데이터를 처리하게 되어있을겁니다.
원래 TCP라는 놈이 스트림 방식으로 되어있기때문에 정확히 보낸 메시지를 내가 한번에 읽을수 있다는 보장은 전혀없습니다.
따라서 먼저 해석하신 데이터 길이를 이용하여 여러번 읽어서 데이터를 조합하는 방법이 좋을것 같습니다. 실제적으로 그렇게 구현되어 있는 경우도 많고요.
데이터 10bytes 정도는 보통 한번에 읽을 가능성이 매우 큰데... 계속 그런 현상이 발생하면 클라이언트에서 제대로 메시지 전송을 하였는지도 체크해 보세요..
하지만 원칙적으로 TCP 스트림 방식입니다. 언제나 정확히 한번에 읽는다는 보장은 없습니다.
/*************************************************** * 가장 심플한 것이 가장 아름다운 것이다. ***************************************************/
10byte 이하가 읽히는 경우는 있고요.. 반복해서 읽기는 읽어야 하는데, looping 돌면서 recv 하는게 아니라 recv event 가 발생되었을때 recv를 하여야 겠죠.
네트워크를 통해서 정해진 크기를 받을때까지 기다린다면
만약 header에 정해진 길이보다 더 많이 받았을경우는 어떻게 하
나요
예를들어 1Byte 해더에 를 사용한다면 처음대기시간에 3Byte를
받고 해더를 분석해보니 길이가 20Byte라는걸 알았습니다.
남은 17Byte를 받기위해 계속 기다리고 있는데 19Byte의 테이타
가 왔다면 이 패킷은 폐기하는게 옭은 일인가요 아니면 먼저번에 왔
던 3Btyte와+ 17Byte를 합쳐서 처리를하고 2Byte를 다른 명령
어의 data로 인식하고 하고 2Byte에서 header로 인식하여
다시 해더에 정해진 길이만큼 받을때까지 기다려서 처리하는게 옳
을까요
ㅡ.ㅡ. 제가 써놓고도 읽보니 횡설수설하는듯..
만약에 최악의 상황을 가정한다면 클라이언트에서 테이타를 보냈는
데 서버에서는 클라이언트가 하나 보냈다는것을 인식하기도 전에
같은 클라이언트가 다시 테이타를 보냈다면 서버 입장에서는
명령어1Header+data + 명령어2Header + data이렇게되거나
명령어1Header+data + 명령어2Header + data일부
이런경우를 말합니다.
노력은 배반하지 않는다.
합쳐서 처리하세요. 당연히 버리면 안됩니다. 데이터 전송에 문제가 발생하면 크리티컬한 문제가 발생시에는 connection을 종료시켜버리는게 좋습니다.
위와 같은경우는 로드가 걸릴때 자주 발생합니다. 계속적으로 읽어서 처리하세요. 헤더 읽고 데이터읽고 모잘라면 기다리고... 서버프로그램의 일반적인 루틴입니다.
그렇군요.. 저도 그런쪽으로 생각하고 있었는데요.
아는사람이랑 이야기하는데 버러야 된다는식으로 이야기 해서요..
감사합니다.
iocp는 IO Completion Port 의 약자란건 알고 계실것 같은데요.
그러니까 질문의 전제 조건이 Client에서 10Bytes를 보냈는데 server에서 10Bytes 미만으로 받는경우...
iocp에선 이런 경우는 없습니다. iocp를 이용하면 io 요청을 하면 해당 요청이 완료 됐을때 port를 통애 결과를 통보받게 됩니다. 그러니까 client에서 몇바이트를 보냈냐가 중요한게 아니고...server에서는 10Bytes를 받겠다고 했을테니까.. 10Bytes가 받아지기 전까지는 완료 통보가 도착하지 않는거죠.
iocp와 select등의 전통적인 방법은 개념이 다른거죠.
그래도 서버가 과부하로 io를 처리하지 못하는 상태에 있고 클라이언트에서
data를 여러번 보낸다면 그럴수 있찌 않나요.
아무 문제가 되지 않는건가요.. 궁금합니다.
그래도 서버가 과부하로 io를 처리하지 못하는 상태에 있고 클라이언트에서 data를 여러번 보낸다면 그럴수 있찌 않나요. 아무 문제가 되지 않는건가요.. 궁금합니다.
data를 전송할때도 원하는 길이 만큼 전송했는지 검사해보세요.
Effective TCP/IP Programming : 44 Tips to Improve Your Network Programs
텍스트 포맷에 대한 자세한 정보
<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]
TCP는 스트림 방식입니다.
IOCP를 사용하셨다면 비동기적으로 데이터를 읽으실텐데...
스래드에서 데이터를 처리하게 되어있을겁니다.
원래 TCP라는 놈이 스트림 방식으로 되어있기때문에 정확히 보낸 메시지를 내가 한번에 읽을수 있다는 보장은 전혀없습니다.
따라서 먼저 해석하신 데이터 길이를 이용하여 여러번 읽어서 데이터를 조합하는 방법이 좋을것 같습니다. 실제적으로 그렇게 구현되어 있는 경우도 많고요.
데이터 10bytes 정도는 보통 한번에 읽을 가능성이 매우 큰데... 계속 그런 현상이 발생하면 클라이언트에서 제대로 메시지 전송을 하였는지도 체크해 보세요..
하지만 원칙적으로 TCP 스트림 방식입니다. 언제나 정확히 한번에 읽는다는 보장은 없습니다.
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
10byte 이하가 읽히는 경우는 있고요..반복해서 읽기는 읽어야 하
10byte 이하가 읽히는 경우는 있고요..
반복해서 읽기는 읽어야 하는데,
looping 돌면서 recv 하는게 아니라
recv event 가 발생되었을때 recv를 하여야 겠죠.
그럼 이런경우는 어떻게 하는게 맞는 방법일까요.
네트워크를 통해서 정해진 크기를 받을때까지 기다린다면
만약 header에 정해진 길이보다 더 많이 받았을경우는 어떻게 하
나요
예를들어 1Byte 해더에 를 사용한다면 처음대기시간에 3Byte를
받고 해더를 분석해보니 길이가 20Byte라는걸 알았습니다.
남은 17Byte를 받기위해 계속 기다리고 있는데 19Byte의 테이타
가 왔다면 이 패킷은 폐기하는게 옭은 일인가요 아니면 먼저번에 왔
던 3Btyte와+ 17Byte를 합쳐서 처리를하고 2Byte를 다른 명령
어의 data로 인식하고 하고 2Byte에서 header로 인식하여
다시 해더에 정해진 길이만큼 받을때까지 기다려서 처리하는게 옳
을까요
ㅡ.ㅡ. 제가 써놓고도 읽보니 횡설수설하는듯..
만약에 최악의 상황을 가정한다면 클라이언트에서 테이타를 보냈는
데 서버에서는 클라이언트가 하나 보냈다는것을 인식하기도 전에
같은 클라이언트가 다시 테이타를 보냈다면 서버 입장에서는
명령어1Header+data + 명령어2Header + data이렇게되거나
명령어1Header+data + 명령어2Header + data일부
이런경우를 말합니다.
노력은 배반하지 않는다.
합쳐서 처리하세요. 당연히 버리면 안됩니다.데이터 전송에 문제가 발생
합쳐서 처리하세요. 당연히 버리면 안됩니다.
데이터 전송에 문제가 발생하면 크리티컬한 문제가 발생시에는
connection을 종료시켜버리는게 좋습니다.
위와 같은경우는 로드가 걸릴때 자주 발생합니다.
계속적으로 읽어서 처리하세요. 헤더 읽고 데이터읽고 모잘라면
기다리고... 서버프로그램의 일반적인 루틴입니다.
감사합니다.. 한참 고민했었는데..
그렇군요.. 저도 그런쪽으로 생각하고 있었는데요.
아는사람이랑 이야기하는데 버러야 된다는식으로 이야기 해서요..
감사합니다.
노력은 배반하지 않는다.
iocp
iocp는 IO Completion Port 의 약자란건 알고 계실것 같은데요.
그러니까 질문의 전제 조건이
Client에서 10Bytes를 보냈는데 server에서 10Bytes 미만으로 받는경우...
iocp에선 이런 경우는 없습니다.
iocp를 이용하면 io 요청을 하면 해당 요청이 완료 됐을때 port를 통애 결과를 통보받게 됩니다.
그러니까 client에서 몇바이트를 보냈냐가 중요한게 아니고...server에서는 10Bytes를 받겠다고 했을테니까.. 10Bytes가 받아지기 전까지는 완료 통보가 도착하지 않는거죠.
iocp와 select등의 전통적인 방법은 개념이 다른거죠.
iocp의 개념을 그렇다는건 알고 있는데요.
그래도 서버가 과부하로 io를 처리하지 못하는 상태에 있고 클라이언트에서
data를 여러번 보낸다면 그럴수 있찌 않나요.
아무 문제가 되지 않는건가요.. 궁금합니다.
노력은 배반하지 않는다.
Re: iocp의 개념을 그렇다는건 알고 있는데요.
data를 전송할때도 원하는 길이 만큼 전송했는지 검사해보세요.
이책을 한번 읽어보세요. TCP/IP 프로그래밍할때의 가려움을
긁어주더군요.
댓글 달기