Q&A

  • Indy (인디) 에서 가변 데이터 보내는 방법을 알려주세요..
인디로 간단한 메신저를 만들고 있습니다.

클라이언트에서 서버에 접속을 하면 서버의 Connect 이벤트에서  접속한 클라
이언트의 사용자명과 IP 를 하나의 TStringList에 추가 시킵니다.

이렇게 계속 클라이언트가 접속을 하였다가 접속을 끊게 되면 TStringList 에 Add, Delete 가 되는데 문제는 이 TStringList 를 클라이언트에 보내는것이 문제입니다. 가변길이라 어떻게 보내야 할지 모르겠습니다!!

또 클라이언트에서 받을때는 어떻게 처리해 주어야 하는건가요?
이것때문에 이틀을 삽질 해봤지만... 실패하였습니다.

제발 좀 알려주세요

rocedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);  // 접속시
var
  List : TList;       // AThread(접속자) 를 저장하기 위한 리스트
  Loop : Integer;     // 클라이언트 모두에게 메시지 전송을 위한 루프문 변수
  IdpeerThread : TIdPeerThread;  // 접속자를 보다 간단히 표시 하기 위해
  testPacket : string;

begin

  userList:=TStringList.Create;   // 접속시 사용자명 리스트 생성
  AThread.Connection.ReadBuffer(PacketInfo,BufferSize); // 버터를 읽어라
  PacketInfo.userIP := AThread.Connection.Socket.Binding.PeerIP; // 읽은 버퍼에 접속클라이언트 IP를 저장
  userList.Add(PacketInfo.userName+','+PacketInfo.userIP); // 접속된 사용자명과 IP 를 리스트에 저장
  userList.Sort;
  List := IdTCPServer1.Threads.LockList;  // 모든 클라이언트에게 전달하기 위해 접속된 클라이언를 리스트로 만든다.
  try
    for Loop := 0 to List.Count-1 do Begin
      IdpeerThread := TIdPeerThread(List.Items[Loop]); // 한개의 클라이언트를 보기 쉽게..
      try
        testPacket:='yoonhome';
        dpeerThread.Connection.WriteBuffer(userList,sizeof(TStringList)); //이렇게 쓰면 전송이 안되는군요.. 가변길이라 그런것 같은데.. 어떻게 바꿔 줘야 할까요?
      except
        IdpeerThread.Stop;
      end;
    end;

  Finally
      IdTCPServer1.Threads.UnlockList; // 변동을 못하게 햇던 리스트를 풀어 줌
  end;
end;
1  COMMENTS
  • Profile
    김용덕 2004.05.28 18:49
    안녕하세요.
    일단 소스를 보니 전송이 안되는 이유는 TStringList instance를 통채로 보내서 그런것이 아닌가 합니다.
    그리고 가변 Length Packet이라면 그에 해당하는 프로토콜을 정의하셔서 하는것이 나을것 같습니다. 예를 들자면 Length를 먼저 전송하고 Client에서 Length를 먼저 받으면 Length 만큼 받을 준비를 하도록 말이죠.
    도움이 되실지 모르겠습니다.
    그럼 이만...