Q&A

  • Socket Client의 수신이 이상해요.
제가 TTCPClient를 사용해서 소켓 클라이언트를 만들었습니다.

서버프로그램을 펄루 했는데 인디소켓으로 하니깐 수신이 잘 안되고
에러가 나서 ......

그래서 수신은 잘되고요.
수신코딩은 스레드안에 ReceiveBuf를 넣어서 구현했는데요.
이게 다음 패킷이 들어오기 전까지는 스레드를 종료할 수 가 없더군요.
그래서 종료 누르고 다음 패킷이 들어올때까지 기다리는 건 이상하자나요?

고수님들은 어찌 프로그램하시나요? 소켓은 첨이라서......
좋은 방법이 없을까요?
아래는 제 코딩입니다.....

일단 연결할 시에는 연결 버튼을 눌러서

procedure TForm1.Button4Click(Sender: TObject);
begin
      TCPClient1.RemoteHost := edServer.Text;  // 서버 아이피
      TCPClient1.RemotePort := inttostr(sePort.Value);  // 서버 포트
      if TCPClient1.Connect then begin
         Label7.Caption := 'Connected';
         IdThreadComponent1.Start;
      end;
end;

이렇게 처리했구요.

수신은 인디 스레트 컴포의 런이벤트에  넣었습니다.

procedure TForm1.IdThreadComponent2Run(Sender: TIdCustomThreadComponent);
const
  MAX_SIZE = 1000;
var
  nReceiveLen : integer;
  szBuf : array of char;
  msg : string;
begin
  if TCPClient1.Connected then begin
    SetLength(szBuf, MAX_SIZE);
    nReceiveLen := TCPClient1.ReceiveBuf(pChar(szBuf)^, MAX_SIZE);
    SetLength(szBuf, nReceiveLen);
    msg := string(szBuf);
    memo1.Lines.Add(msg);
   end;
end;

종료시에는 ----------------------------------

procedure TForm1.Button2Click(Sender: TObject);
begin
    if IdThreadComponent1.Active then begin
       IdThreadComponent1.Stop;
       IdThreadComponent1.WaitFor;
    end;
    TCPClient1.Disconnect;
end;
1  COMMENTS
  • Profile
    구니 2003.10.26 00:52
    음.. 제가 실수 했군요.
    작업 버전도 안올리다니.. 델파이 7이었구요.

    WaitForData()라는 훌륭한 메소드가 있었군요.......
    read시에 앞에 써주면 되는군요...