Indy9 에서는 WriteBuffer 로 때려박으면 되었지만, Indy10 에서는 WriteBuffer 라는 함수 자체가 사라졌음.
하는 방법은 구조체를 TIdBytes로 변환해서 보내고, 받을 때는 TIdBytes를 다시 원하는 형태로 변환해서 처리하는 것.
 
 
아래 예제는 TIdTCPClient -> TIdTCPServer 형식.
 
보내기
 
procedure TfrmClient.ButtonSendClick(Sender: TObject);
var
  Buffer: TIdBytes; 
  MyRecord: TMyRecord;
begin
  if IdTCPClient1.Connected then begin
    // MyRecord 에 뭔가 세팅하는 부분...
 
    Buffer:=RawToBytes(MyRecord, SizeOf(TMyRecord));
    IdTCPClient1.IOHandler.Write(Buffer);
  end;
end;
 
 
 
 
 
 
받기
 
procedure TfrmServer.IdTCPServer1Execute(AContext: TIdContext);
var
  Buffer: TIdBytes;
  MyRecord: TMyRecord;
begin
  // if 체크하는 부분에서 접속여부와 함께 and 로
  // AContext.Connection.IOHandler.Readable 을 넣는 것도 좋으나
  // 완전 빠른 Non-blocking 으로 돌리고자 하면 없는 게 좋다는 생각
  // 대신 Recv 해서 변환한 구조체의 무결성을 체크하는 방법을 사용하는 게 더 좋지 않을까
  if AContext.Connection.Connected then begin
    ZeroMemory(@MyRecord, SizeOf(TMyRecord));
    AContext.Connection.IOHandler.ReadBytes(Buffer, SizeOf(TMyRecord), False);
    BytesToRaw(Buffer, MyRecord, SizeOf(TMyRecord));
 
    // 받아온 MyRecord 로 뭔가 하는 부분...
  end;
end;





Posted by bloodguy
,