我有一个
TIdUDPServer
监听端口 255。
事件 OnUDPRead
被分配监听任何入站数据包,偶尔需要回复客户端。
为了回复,我使用事件中提供的
ABinding
套接字句柄,并向服务器返回 TIdBytes 数组。但是,为此我需要连接绑定。这是我的方法:
procedure TExplorer.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
// Here FReplyData would be initiated
// Reply
if Length(FReplyData) > 0 then
begin
ABinding.Connect;
ABinding.Send(FReplyData);
end;
end;
这可以完美地工作,但是在执行
Connect()
之后,绑定不再侦听所有地址,而仅侦听对等地址。从0.0.0.0
到<client_adress>
。
这是预期行为,如 Indy10 文档中所述:
Connect 是一个虚拟过程,用于打开与 PeerIP 的连接 PeerPort 使用描述符的套接字句柄。连接用途 GStack全局协议栈将套接字句柄连接到 远程系统。
Connect 调用 UpdateBindingLocal 和 UpdateBindingPeer 来反映 连接时使用的真实IP地址和端口号 套接字句柄已分配。该操作是线程安全的;这是 由内部 TIdCriticalSection 实例保护。
使用 CloseSocket 关闭并销毁套接字句柄。
问题是,一旦我发送了数据包,我想继续侦听所有其他请求,或者更准确地说,保持与“0.0.0.0”的绑定到
Un-connect
它。
到目前为止,我尝试了以下方法:
ASocket
的IP并重新绑定那么,我做错了什么?任何想法将不胜感激!
我想通了。
使用
ABinding.Connect()
会将套接字分配给对等 IP。根据我的测试,我相信事后没有办法改变暴饮暴食,或者也许有,但我只是没有足够深入地研究这件事。
但是为了在不连接到对等套接字的情况下回复请求,您将需要使用
ABinding.SendTo()
来代替。
这从一开始就应该更加明显,但我错过了这个事实,因为我使用了 ABinding.IP
而不是 ABinding.PeerIP
,这会将包装发送到错误的目的地。
因此,要将数据包从 Binding 发送到 Peer,您可以使用以下代码序列:
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, FReplyData, ABinding.IPVersion);
目的地是 Peer,
FReplyData
是 TIdBytes
类型。