프로그래밍/델파이

아놔 델파이 TTcpClient로 문자열 보내기

panpro 2010. 3. 4. 23:02
이거이 안된다. 팀장님이 TTcpClient.sendln(String)과 TTcpServer의 receiveln(String) 을 이용해서 간단하게 통신하는 소스를 가져와서 보여주셨는데, 이거이 문자열이 깨진다.

만약 11을 보내면 서버에서 잘 받아지는데,
1111을 보내면 11만 제대로 오고 나머지는 쓰레기값이다.

그래서 String을 byte로 변환해서 byte로 보내려고 했는데, 
이거이 String이 이상하게 값을 관리하고 있다.

만약 abcd 를 저장하고 있는 String 변수를 byte 배열로 변환해서 보면 

97 0 98 0 99 0 100 0

이렇게 되어 있다. 오잉. 가운데 0은 모지. 
하도 오랜만에 델파이를 만지니 원래 저랬나 싶기도 하고. 
한국어로 쓰겠다고 하면 String이 원래 2바이트로 저장하나 싶기도 하고. 여튼 그렇다. 

질문 1. 델파이에서 메모리 보는 거 원래 없었어? 왜 안보이지? 이게 없는데 내가 어떻게 델파이로 프로그램을 만들고 놀았을까..

그래서 AnsiString에 옮겨 담았다.

ansiStr := AnsiString(msg);

AnsiString에만 옮겨담아도 

97 98 99 100 

으로 잘 나온다. 

문자열을 byte 배열로 옮겨담은 과정은 다음과 같다.
    
 // byte 배열로 변환
      for I := 0 to 255 do
        arBytes[I] := 0;

      ansiStr := AnsiString(msg);

      nLength := length(ansiStr);
      move(ansiStr[1], arBytes[0], nLength);

      TcpClient1.SendBuf(arBytes, nLength);


그리고 서버에서는 OnAccept에서 이렇게 받아 처리했다.

var
    s: AnsiString;
    buffer: array [0..255] of byte;
  I: Integer;
begin
    LabeledEdit2.Text:=ClientSocket.RemoteHost;

    for I := 0 to 255 do
      buffer[I] := 0;

    ClientSocket.ReceiveBuf(buffer, 256);

    setLength(s, 256);
    move(buffer[0], s[1], 256);
    ListBox1.Items.Add(s);

setLength 함수도 웃기다. 저렇게 하고 나면 s에 쓰레기값이 잔뜩 채워진다. 아 이거 주소 바뀌었는지도 확인 안해봤네. 주소 바뀌고 쓰레기값으로 채워지면 할말 없고. (설마.. ㅎㅎ)

여튼 저렇게 했더니 이제 한글도 잘 된다. 한글 안되면 UTF-8로 변환하려고 했는데. 
아 간만에 델파이 썼더니.. 거참.. 왜 메모리 보는 게 없을까. 있을꺼야. 있을껴. 있어야만해.