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
[23442] Re:Re:[요청] Socket->Data를 하고 싶은데 어떻게 하는지 몰라용~ㅠㅠ
SteelHeart [] 1031 읽음    2002-12-28 18:58
꾸벅(_ _

클라이언트 쪽 소스를 보면, 시도 자체가 이상하네요.

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 계열 함수를 쓰신다면, 크기 체크를 해 줘야 합니다.

그리고 그 함수들은 호출되는 동시에 읽어들이거나 보낸다고 생각하세요.

그러니, 매번 호출할 때 마다 계속 읽거나 보내는 게 당연합니다.


그리고 팁 게시판 같은 데 찾아보면, 소켓으로 데이터를 주고 받을 때

유의해야 할 점들이 조금 있는데요.

그중에서 이번 경우에는, 보내고 받는 사이에 약간의 딜레이를 줘야 한다는 게

(그리고 강제로 버퍼를 비우라는 것이) 주의사항이 되겠습니다.


제가 바르게 답변드린것인지 모르겠습니다만, 일단 적어두신 소스만으로 볼 때는

말씀드린 것 처럼, 몇가지 문제가 있네요.


그럼 이만.

+ -

관련 글 리스트
23412 [질문] 소켓에 남아있는 값을 지우는 방법은? 시간한줌 1024 2002/12/27
31462     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? 서정국.새더 1414 2002/12/27
31461     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? utime->김성하 949 2002/12/27
31460     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? Julien 1028 2002/12/27
31459     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? Julien 1039 2002/12/27
31458     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? Julien 1011 2002/12/27
31457     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? 수야!╋ 1055 2002/12/27
31456     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? 수야!╋ 967 2002/12/27
31455     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? 수야!╋ 966 2002/12/27
31454     Re:[질문] 소켓에 남아있는 값을 지우는 방법은? 수야!╋ 995 2002/12/27
23424     Re:[질문] 우엥~ 안되여~ 시간한줌 1007 2002/12/27
23435         [추측] Socket->Data를 클리어해보시면....(냉무) 정성훈.해미 1542 2002/12/28
23441             Re:[요청] Socket->Data를 하고 싶은데 어떻게 하는지 몰라용~ㅠㅠ 시간한줌 1077 2002/12/28
23442                 Re:Re:[요청] Socket->Data를 하고 싶은데 어떻게 하는지 몰라용~ㅠㅠ SteelHeart 1031 2002/12/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.