|
안녕하세요!
대충 소스를 봤습니다..
먼저 서버에서 받은 패킷이 님이 버퍼에서 읽을 량보다 많으면...
담 쓰레드에서 남은 패킷을 읽어 드립니다..
이경우에 님이 선언하신 패킷 데이타 포멧에 엉뚱한 값이 들어가서.. 님이
원하는 결과를 얻을수가 없을수가 있습니다
반대로 서버에서 받은 패킷이 읽을 패킷보다 적으면 이건 에러가 발생하지요..
아마도 try chach 에 걸릴거 같군여...
전 이만 급해서..
도움이 되어쓰면 합니다..
박정만 님이 쓰신 글 :
: 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()로 넘어가나요?
: 그래서, 성공할때까지 위 작업을 반복하는게 맞는 것인지 알고 싶습니다.
:
: 듣기로는 서버에서 보낸 패킷 자체가 아예 분실되어서, 클라이언트로 안가는 경우도 있다고 들었는데, 이 경우에는 어떻게 처리해야 좋을지 모르겠네요..
:
: 도움 부탁드립니다.
|