有没有办法在不重新启动服务器的情况下重置 TIdUDPServer 的绑定?

问题描述 投票:0回答:1

我有一个

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并重新绑定
  • 使用SendTo代替,但基本上是一样的 还有其他一些东西,但没有一个起作用。

那么,我做错了什么?任何想法将不胜感激!

delphi networking indy
1个回答
0
投票

我想通了。

使用

ABinding.Connect()
会将套接字分配给对等 IP。根据我的测试,我相信事后没有办法改变暴饮暴食,或者也许有,但我只是没有足够深入地研究这件事。

但是为了在不连接到对等套接字的情况下回复请求,您将需要使用

ABinding.SendTo()
来代替。 这从一开始就应该更加明显,但我错过了这个事实,因为我使用了
ABinding.IP
而不是
ABinding.PeerIP
,这会将包装发送到错误的目的地。

因此,要将数据包从 Binding 发送到 Peer,您可以使用以下代码序列:

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, FReplyData, ABinding.IPVersion);

目的地是 Peer,

FReplyData
TIdBytes
类型。

© www.soinside.com 2019 - 2024. All rights reserved.