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;

我已将完整的客户端和服务器上传到:http ://www.2shared.com/file/5SRweGIa/Indy_UDP.html

感谢任何指针。:)

4

1 回答 1

2

您是否偶然从旧版本的 Delphi 和/或 Indy 升级您的项目,却忘记检查事件处理程序的签名更改?该事件很久以前就TIdUDPServer.OnUDPRead停止使用TStream它的参数。AData它改为使用TIdBytes

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

几周前,我们不得不更改ADataXE3 的参数以最终解决所有 2009+ 版本中 Delphi 和 C++ 之间的 RTTI 不兼容问题:

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 回答