Frage

Ich habe den folgenden Code in der OnExecute eines TIdTCPServer (Delphi 2009 und Indy 10, die mit der Installation kam), die auf andere Beispiele auf dieser Seite sehr ähnlich ist;

   Socket := AContext.Connection.Socket;
    if Socket.CheckForDataOnSource(10) then
    begin
      if not Socket.InputBufferIsEmpty then
      begin
        Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

        SetLength(Buffer, Length(RawBytes));
        Move(RawBytes[0], Buffer[1], Length(RawBytes));

        // Do stuff with data here...
      end;
    end;
    AContext.Connection.CheckForGracefulDisconnect;

Sie lesen die Daten nicht in manchmal als CheckForDataOnSource (10) gibt False zurück. Allerdings, wenn ich den Debugger an dieser Linie stoppen kann ich die Daten sehe ich in der Inputbuffer des Bytes gesendet. Gibt es noch andere Dinge, die ich Setup-Möglichkeiten tun oder andere soll diese zu zwingen, die ganze Zeit zu arbeiten. Dieser Code wird Bündel Zeiten laufen, aber immer fehl am CheckForDataOnSource (10).

Auch als eine Randnotiz, bemerke ich in Code für Indy rund um den Ort, dass einige Leute den AContext.Connection.IOHandler anstelle des AContext.Connection.Socket greifen und die gleichen Dinge tun wie der Code oben, was ist die " Recht“zu verwenden.

Danke

Bruce

War es hilfreich?

Lösung

Der Code sollte so aussehen:

var
  IO: TIdIOHandler.
  Buffer: RawByteString;
begin
  IO := AContext.Connection.IOHandler;

  if IO.InputBufferIsEmpty then
  begin
    IO.CheckForDataOnSource(10);
    if IO.InputBufferIsEmpty then Exit;
  end;

  IO.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);     
  // or: IO.ReadBytes(RawBytes, -1, False);

  SetLength(Buffer, Length(RawBytes));
  BytesToRaw(RawBytes, Buffer[1], Length(RawBytes));
  // Do stuff with Buffer here...
end;

Andere Tipps

Es sieht aus wie Ihr Code soll wie folgt aussehen;

Socket := AContext.Connection.Socket;
Socket.CheckForDataOnSource(10);
if not Socket.InputBufferIsEmpty then
begin
  Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

  SetLength(Buffer, Length(RawBytes));
  Move(RawBytes[0], Buffer[1], Length(RawBytes));

  // Do stuff with data here...
end;
AContext.Connection.CheckForGracefulDisconnect;

Es spielt keine Rolle, was IOHandler Sie greifen, so dass die generische wie unterwegs zu sein scheint.

Tut mir leid, meine eigene Frage zu beantworten, aber es könnte für jemanden ... vielleicht hepful sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top