【问题标题】:Indy UPDServer in windows service not listeningWindows服务中的Indy UPDServer没有监听
【发布时间】:2016-04-12 14:45:33
【问题描述】:

我创建了一个 Windows 服务,它将在服务器机器上运行,并且必须侦听客户端的请求以通过 UDP 向它们发送文件。我制作了客户端应用程序,现在我正在尝试向服务器发送 UDP 消息,但似乎没有调用 UDPRead 过程。我在 Windows 10 中使用 Delphi XE7。测试环境是:

  • 客户端:表单应用程序,TIdUDPServer 监听端口 27905。 正确发送和接收数据。
  • 服务器:Windows 服务,TIdUDPServer 监听端口 27906。 使用TIdUDPServer.Send 正确发送数据,但收不到 任何东西。
  • 防火墙和防病毒软件已停用,以防万一。
  • 包正在发送到 IP 127.0.0.1

我验证了问题出在 Windows 服务上,因为我在 Windows 服务的主类的 Create 方法中编码了 TIdUDPServer.Send,只是为了查看客户端应用程序是否接收到它,它确实接收到了它。此外,我已经将 UDP 包从客户端发送到我最近开发的另一个表单应用程序,以查看它是否正在接收数据,并且确实如此。

我在 Windows 服务应用程序中创建 TIdUDPServer 对象,如下所示:

UDP := TIdUDPServer.Create(nil);
UDP.OnUDPRead := UDPRead;
UDP.DefaultPort := pListenPort;
UDP.Bindings.Clear;
UDP.Bindings.Add.IPVersion:=Id_IPv4;
UDP.Active := True;

而程序声明是:

procedure TRed.UDPRead(AThread: TIdUDPListenerThread; const AData: TidBytes; ABinding: TIdSocketHandle);

可能我遗漏了一些东西,但我找不到 Windows 服务中的 UDPServer 失败的原因。任何线索将不胜感激,在此先感谢您。

【问题讨论】:

  • 使用命令行 netstat 或类似工具来验证服务器实际上处于侦听状态,并查看它实际侦听的 IP/端口(应为 0.0.0.0:27906)。确保客户端将数据发送到正确的 IP/端口 (127.0.0.1:27906)。尝试将 TIdUDPServer.ThreadedEvent 设置为 true。当ThreadedEvent 为假时,OnUDPRead 事件由对TThread.Synchronize() 的调用触发。您的服务可能未处理 Synchronize() 请求。将 ThreadedEvent 设置为 true 可以绕过这一点,只需确保您的事件处理程序在其中使用线程安全代码。
  • 设置TIdUDPServer.ThreadedEvent为true解决了问题,现在正在接收数据,非常感谢!如果您愿意,请发表评论作为回答,以便我接受。
  • 我已经发布了答案。

标签: sockets delphi udp indy


【解决方案1】:

TIdUDPServer 使用工作线程循环读取传入数据,每当有新数据到达时触发OnUDPRead 事件。

默认情况下,OnUDPRead 事件处理程序由对TThread.Synchronize() 的调用触发,这意味着它在主 UI 线程(或至少任何调用 RTL 的 CheckSynchronize() 函数的线程)的上下文中触发,不在 UDP 工作线程中。很有可能您的服务没有处理 Synchronize() 请求,这可以解释为什么事件处理程序永远不会触发。

所以,您有两种可能的选择:

  1. 让您的服务定期调用CheckSynchronize(),例如在其OnExecute 事件中。然后OnUDPRead 事件将在服务线程的上下文中触发。

  2. TIdUDPServer.ThreadedEvent 属性设置为true(默认为false)。当ThreadedEvent 为真时,UDP 工作线程绕过Synchronize() 并直接触发OnUDPRead 事件。因此,您只需确保您的事件处理程序在其中包含线程安全代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2015-09-25
    • 2015-09-18
    • 2012-04-27
    • 2015-10-17
    相关资源
    最近更新 更多