2

TIdTCPServer (インストールに付属の Delphi 2009 および Indy 10) の OnExecute に次のコードがあります。これは、このサイトの他の例と非常によく似ています。

   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;

CheckForDataOnSource(10) が False を返すため、データを読み取らないことがあります。ただし、その行でデバッガーを停止すると、InputBuffer のバイトで送信したデータを確認できます。私がしなければならない他のセットアップや、これを常に機能させる他の方法はありますか? このコードは何度も実行されますが、常に CheckForDataOnSource(10) で失敗します。

また、補足として、一部の人々が AContext.Connection.Socket の代わりに AContext.Connection.IOHandler を取得し、上記のコードと同じことを行う場所の周りの Indy のコードに気付きました。「正しい」ものは何ですか?使用する。

ありがとう

ブルース

4

2 に答える 2

5

コードは次のようになります。

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;
于 2009-10-05T22:05:50.937 に答える
0

コードは次のようになります。

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;

どのIOHandlerを取得するかは問題ではないため、一般的なIOHandlerはうまくいくように見えます。

私自身の質問に答えて申し訳ありませんが、誰かにとっては大げさかもしれません...多分。

于 2009-10-02T06:23:33.807 に答える