【发布时间】: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解决了问题,现在正在接收数据,非常感谢!如果您愿意,请发表评论作为回答,以便我接受。 -
我已经发布了答案。