|
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()로 넘어가나요?
그래서, 성공할때까지 위 작업을 반복하는게 맞는 것인지 알고 싶습니다.
듣기로는 서버에서 보낸 패킷 자체가 아예 분실되어서, 클라이언트로 안가는 경우도 있다고 들었는데, 이 경우에는 어떻게 처리해야 좋을지 모르겠네요..
도움 부탁드립니다.
|