Question

Je le code suivant dans le OnExecute d'un TIdTCPServer (Delphi 2009 et Indy 10 qui est venu avec l'installation) qui est très similaire à d'autres exemples sur ce site;

   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;

Il ne lit pas les données parfois retourne CheckForDataOnSource (10) Faux. Toutefois, si j'arrête le débogueur à cette ligne, je peux voir les données que j'ai envoyé dans le Bytes InputBuffer. Y a-t-il d'autres choses de configuration que je dois faire ou d'autres moyens de forcer cela fonctionne tout le temps. Ce code est exécuté tas de fois, mais échoue toujours sur la CheckForDataOnSource (10).

En outre comme une note de côté, je remarque dans le code pour Indy autour de la place que certaines personnes attrapent la AContext.Connection.IOHandler au lieu du AContext.Connection.Socket et de faire les mêmes choses que le code ci-dessus, quel est le " bon » à utiliser.

Merci

Bruce

Était-ce utile?

La solution

Le code devrait être plus comme ceci:

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;

Autres conseils

Il semble que votre code devrait ressembler à ceci;

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;

Peu importe ce que vous prenez IOHandler, de sorte que le générique semble que vos déplacements.

Désolé pour répondre à ma propre question, mais il pourrait être quelqu'un hepful ... peut-être.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top