Q&A

  • readBuf와 readLn의 차이는???
1.
  
var
ArrBuf: array[0..2047] of Byte;
.....
form1.IdTCPClient1.ReadBuffer(ArrBuf,SizeOf(ArrBuf));
showMessage('여기까지 진행되지 않습니다.');

2.
var
Msg: String;
.....
Msg := form1.IdTCPClient1.Readln;
showMessage('여기는 진행이 됩니다.');


readBuffer를 쓸 경우 다음 메세지창이 뜨는 곳까지 진행이 되지 않습니다.

그냥 프로시저를 싱행하고 멈춰있네요.

받아오는건 단순한 string이구요(구조체가 아닌..) 다른 건 그냥 놔두고

readBuffer만 readln으로 바꿔주면 잘 진행이 됩니다.

왜 이러는건지 이유를 모르겠네요..

많은 가르침 바랍니다.

2  COMMENTS
  • Profile
    한원희 2003.03.21 02:49
    안녕하세요. 한원희입니다.

    ReadBuffer는 구조체와 같이 정해진 크기만큼의 데이터를 소켓에서 읽어올 때 사용합니다(고정된 크기에 적당). ReadLn은 캐리지 리턴을 만나때까지 소켓에서 읽습니다(가변크기에 적당).

    보내는 것이 단순한 스트링이라면 1과 같이 쓰시는 것은 위험합니다. 왜냐하면, 그 스트링의 길이가 가변적이기 때문이죠... 만약, 먼저 스트링의 길이를 보내준다면, 그 크기만큼 ReadBuffer 함수를 사용해서 데이터를 읽을 수 있겠죠.
    아래에서 만약 보낸 스트링의 길이가 10바이트라면, ReadBuffer로 읽으려는 데이터는 2047 바이트이니...나머지가 채워질때까지 마냥 기다리게 됩니다. 물론 서버에서 계속 데이터를 보낸다면, 계속 받아서 2047 바이트가 채워져야 ReadBuffer 함수가 종료되고, ShowMessage 함수가 실행되겠죠.

    이상 허접한 답변 이었습니다.

  • Profile
    구창민 2003.03.21 01:43
    그 메소드들을 쫓아가 보시면 원인을알아내실 수 있을 듯 합니다.

    먼저 송수신 되는 규약은 정하셨는지요?

    또한 그 약속대로 크기만큼 송수신 하시는 건지요?

    참고하시고 즐거운 프로그래밍 하시길~