0

TIdUDPServer の OnUDPRead イベントを使用して、作成した IdUDPClient クライアントから送信されたブロードキャスト データを読み取ろうとすると問題が発生します。次の質問に示されている例を使用してみましたが、役に立ちませんでした。

Delphiでブロードキャストメッセージを送信するにはどうすればよいですか

TIdUDPServer を使用したデータの読み取り

指定したポートに TIdUDPServer をバインドできます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdUDPServer1.BroadcastEnabled := True;
  IdUDPServer1.DefaultPort := StrToInt(edit2.Text);
  IdUDPServer1.Bindings.Add.IP := '0.0.0.0';
  //IdUDPServer1.ThreadedEvent:=True;
  IdUDPServer1.Active := True;
end;

IdUDPServer1UDPRead が正常にトリガーされ、UDP サーバーが動作していることを示していますが、この行で例外が発生します -> DataStringStream.CopyFrom(AData, AData.Size);

例外: モジュール 'IndyUDPReceiver.exe' のアドレス 004BA415 でアクセス違反が発生しました。アドレス 74736574 の読み取り

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;
  AData: TStream; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  msg: string;
begin
  try
    DataStringStream := TStringStream.Create('');
    try
      DataStringStream.CopyFrom(AData, AData.Size);
      msg := DataStringStream.DataString;
      Memo1.Lines.Add(msg);
    finally
      DataStringStream.Free;
    end;
  except
    on E: Exception do
    begin
      Memo1.Lines.Add('Exception:' + E.Message);
      DataStringStream.Free;
    end;
  end;
end;

完全なクライアントとサーバーを次の URL にアップロードしました: http://www.2shared.com/file/5SRweGIa/Indy_UDP.html

ポインタに感謝します。:)

4

1 に答える 1

2

たまたま、プロジェクトを古いバージョンのDelphiやIndyからアップグレードし、署名の変更についてイベントハンドラーを確認するのを忘れましたか?イベントはずっと前にそのパラメータの使用を停止TIdUDPServer.OnUDPReadしました。代わりに使用するように切り替えられました:TStreamADataTIdBytes

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  msg: string;
begin
  msg := BytesToString(AData, Indy8BitEncoding);
  Memo1.Lines.Add(msg);
end;

数週間前、AData2009年以降のすべてのバージョンでDelphiとC ++の間のRTTIの非互換性に最終的に対処するために、XE3のパラメーターを変更する必要がありました。

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: array of Byte; ABinding: TIdSocketHandle);
var
  msg: string;
begin
  msg := BytesToString(AData, Indy8BitEncoding);
  Memo1.Lines.Add(msg);
end;
于 2012-09-24T02:43:18.517 に答える