|
꾸벅(_ _
클라이언트 쪽 소스를 보면, 시도 자체가 이상하네요.
ReceiveLength 는 말 그대로 읽어들인 바이트를 반환하는데
그게 0이 나왔다면, 당연히 아무것도 안받은 셈이지요.
그러니 이 소스는 문제를 일으킬 수 있습니다.
char *buf = new char[Socket->ReceiveLength()];
만약 아무것도 안읽혀서 0이 반환되었다면, 이 코드는 다음과 해석 되겠죠.
char *buf = new char[0];
결국 아무런 메모리 공간도 가지지 않는 포인터 선언이니,
엉뚱한 곳을 가리킬 가능성이 높습니다.
이후에 AnsiString 에 Buf안의 데이터를 넣어주고 있는데요,
어떠한 공간도 배정되지 않았으니, 말 그대로 괴상하게 읽히는게 당연하죠.
AnsiString 은 어떤 데이터든지, 문자열로 해석하고 읽을 테니깐요.
윈속에서 두번 받는다...뭐 그런 말은 잘 모르겠습니다. 저도 허접이라..
그런다 적어두신 소스만 보건데, 기본적인 구상이 좀 의아합니다.
데이터를 받고서 왜 또 다시 받아야 하는지 알 수가 없구요.
(서버쪽에서는 IDG 라는 문자열만 보낸다면서요.
그걸 제대로 받았으니 작업이 성공한 거 아닌가요?)
또 ReceiveBuf 를 쓸 때는, 반드시 받은 바이트 수를 따로 저장한 다음
내가 받을 양과 동일한지 체크해야 합니다.
따라서, 적어주신 소스는 굉장히 불안한 코드입니다. 언제 어디서 에러가 날지 모르죠.
일단 간단한 예부터 들어보겠습니다.
<Server>
AnsiString Buf = "IDG";
Socket->SendBuf(Buf.c_str(), Buf.Length());
<Client>
int ReceiveSize = 0;
ReceiveSize = Socket->ReceiveLength();
if(ReceiveSize != 0)
{
char *Buf = new char[ReceiveSize];
Socket->ReceiveBuf(Buf, ReceiveSize);
AnsiString Data = Buf;
ShowMessage(Data);
}
제가 제대로 파악했다면, 이게 의도하신 것과 가장 일치하는 예가 될겁니다.
위와 같이 ...Buf 계열 함수를 쓰신다면, 크기 체크를 해 줘야 합니다.
그리고 그 함수들은 호출되는 동시에 읽어들이거나 보낸다고 생각하세요.
그러니, 매번 호출할 때 마다 계속 읽거나 보내는 게 당연합니다.
그리고 팁 게시판 같은 데 찾아보면, 소켓으로 데이터를 주고 받을 때
유의해야 할 점들이 조금 있는데요.
그중에서 이번 경우에는, 보내고 받는 사이에 약간의 딜레이를 줘야 한다는 게
(그리고 강제로 버퍼를 비우라는 것이) 주의사항이 되겠습니다.
제가 바르게 답변드린것인지 모르겠습니다만, 일단 적어두신 소스만으로 볼 때는
말씀드린 것 처럼, 몇가지 문제가 있네요.
그럼 이만.
|