【发布时间】:2012-09-22 08:02:21
【问题描述】:
我在尝试使用 TIdUDPServer 的 OnUDPRead 事件读取从我创建的 IdUDPClient 客户端发送的广播数据时遇到问题。我尝试使用以下问题中显示的示例,但无济于事。
How can I send a broadcast message in Delphi
Reading data with 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);
异常:模块中地址 004BA415 的访问冲突 'IndyUDPReceiver.exe'。读取地址 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
感谢任何指针。 :)
【问题讨论】:
-
显然试图读取无法读取的内存。上面代码的确切部分导致了这种情况。哪个对象无法读取?您需要使用调试器,可能还需要使用 asm 调试器来找出答案。
-
是的,在这一行遇到了异常-> DataStringStream.CopyFrom(AData, AData.Size); *** IndyUDPReceiver.exe 项目引发异常类 EAccessViolation,并带有消息“模块“IndyUDPReceiver.exe”中地址 004BA415 的访问冲突。读取地址 74736574'。
-
哪个对象无法读取?使用 cpu 视图调试 asm。
-
嗨大卫,这是我得到的 - imageshack.us/a/img12/3053/capturewy.jpg
-
哪一行是av?