C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[11528] Re:[질문] 인디소켓에서 패킷 전송시 조각나는 현상
최보현.U&I [uriduri] 1562 읽음    2001-09-28 03:07
유앤아이 입니다.

일반적으로 TCP 통신은 패킷순서에 안정적이지만 그 크기에는 절대 안정적이지 않으며
그와반대로 UDP 통신은 패킷순서는 불규칙적일수 있지만 패킷 크기에 대해서는 보장한다.
라고 알고 있습니다. (라우터를 거치지 않는 UDP 는 순서도 안정적입니다)

따라서 아래에 짜신 소스는 TCP 통신이라면 그리고 만에 하나 패킷 싸이즈가 몇토막 나서
패킷이 전송 된다면, 그리고 그게 연속적이라면 채팅은 단 한번도 이루어 지지 않을수 있습니다.

여기서 TCP 로 정해진 구조체의 한패킷을 보냈는데 몇토막난 패킷이 며나고 어떻게 그럴수 있냐구
반문 하시겠지만 ... 약 2K 이상의 패킷을 보내 보십시요~ 절때 한패킷에 않담기는걸 확인 하실수
있을겁니다. 이유는 저도 잘은 모르지만 소켓 레벨에서 또는 네트웤 레벨에서 지기분에 마처서
지가 보내구 싶은대로 보내는 경향이 있더군요~

암튼 그래서 TCP 로 받은 패킷은 항상 안전한 보낸쪽에서 보낸 그대로의 패킷이라고 판단 하면
않됩니다. 따라서 그렇게 조각난 패킷을 다시 한데 모아주는 로직이 들어가야 비로소 안정적이라
할수 있겠지요~

그런데 아래 소스에 보면 ReadBuffer 로 소켓을 읽어버리면 제가 알기로는 부족하면 부족한 만큼
이라도 소켓 레이어에서 데이타를 빼와 버리는것으로 알고 있습니다. 따라서 일단 한번 빠저 버린
데이타는 다음에 다시 원하는 사이즈 만큼 읽을려구 해도 읽혀지지 않는다 이말이저

결론은 그렇게 부족하나마 조각나 패킷이라도 소켓레이어에서 빼와 버렸다면 그 데이타를 다시
관리를 해서 다음조각을 받아와서 합처서 정상적인 패킷 처리를 해야 한다 이겁니다.

그래야만 정상적인 TCP 통신을 할수 있을겁니다 ...

그럼

박정만 님이 쓰신 글 :
: TCP/IP 통신에서 패킷이 한번에 안가고 조각나서 전송되는 일이 다반사라고 들었는데,
:
: 인디소켓에서도 그러한 경우가 있습니까?
:
: 아래처럼 채팅 메세지를 전송할 경우에 애매한 경우가...
:
: typedef struct
: {
:     BYTE  Cmd;
:     BYTE  ChatSize;
: } SEND_CHATMSG;
:
: SEND_CHATMSG   SendMsg;
:
: Cmd = CMD_CHATMSG;
: ChatSize = Edit_Box->Text.Length();
:
: Connection->WriteBuffer((void *)&SendMsg, sizeof(SEND_CHATMSG));
: Connection->WriteBuffer((void *)Edit_Box->Text.c_str(), SendMsg.ChatSize);
:
: 이렇게 서버에서 클라이언트로 보낸다고 가정할때.. (즉석에서 친거라 문법이 맞는진 모르겠지만.. ^^)
: 클라이언트는 아래처럼 받습니다.
:
: typedef struct
: {
:     BYTE ChatSize;
: } RECV_CHATMSG;
:
: RECV_CHATMSG  RecvMsg;
: char ChatMsg[256];
:
: Socket->ReadBuffer((void *)&Cmd, 1);
: if(Cmd == CMD_CHATMSG)
: {
:     Socket->ReadBuffer((void *)&RecvMsg, sizeof(RECV_CHATMSG)); // 채팅 문자열 정보 받음.
:
:     try
:     {  
:         Socket->Readbuffer((void *)ChatMsg, RecvMsg.ChatSize); // 채팅 문자열 받음.
:     }
:     catch(...)
:     {
:         return false;
:         // 차후에 윗줄의 ReadBuffer가 성공할 때까지 재시도
:     }
: }
:
: 이때, 버퍼에 쌓인 메세지의 크기가 패킷보다 작으면 catch()로 넘어가나요?
: 그래서, 성공할때까지 위 작업을 반복하는게 맞는 것인지 알고 싶습니다.
:
: 듣기로는 서버에서 보낸 패킷 자체가 아예 분실되어서, 클라이언트로 안가는 경우도 있다고 들었는데, 이 경우에는 어떻게 처리해야 좋을지 모르겠네요..
:
: 도움 부탁드립니다.

+ -

관련 글 리스트
11502 [질문] 인디소켓에서 패킷 전송시 조각나는 현상 박정만 893 2001/09/27
11528     Re:[질문] 인디소켓에서 패킷 전송시 조각나는 현상 최보현.U&I 1562 2001/09/28
11510     Re:[질문] 인디소켓에서 패킷 전송시 조각나는 현상 xen 1074 2001/09/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.