【问题标题】:Windows Service to continuously monitor network server on TCP portWindows 服务在 TCP 端口上持续监控网络服务器
【发布时间】:2021-08-05 06:03:13
【问题描述】:

这是我第一次涉足套接字编程。我需要一些帮助才能开始。基本上,我有一个在特定 TCP 端口上发送状态更新的服务器。我需要一台客户端计算机来查看这些更新消息。我决定用 C# 创建一个将安装在客户端计算机上的 Windows 服务。我不知道该服务应该是 TCP 侦听器(服务器)还是客户端。任何指导将不胜感激。

【问题讨论】:

    标签: c# service tcp tcpclient tcplistener


    【解决方案1】:

    由于您已经有一个将发送更新的服务器,因此接收这些更新所需要做的就是在您的主机上创建一个 TCP 客户端。这将用作侦听器,只需将其连接到相应服务器的 IP 和端口即可。或者,如果您已经有一个连接到服务器的客户端并且只想拦截流量,请使用 tcpdump 之类的东西。

    【讨论】:

    • 我创建了一个服务,该服务旋转一个线程,该线程使用无限循环几乎每 10 秒侦听一次连接。恐怕让线程休眠 10 秒,我可能会错过一些通信。我可以缩短时间间隔,但有没有办法在不休眠的情况下持续监控连接?
    • 不知道为什么要让线程每 10 秒休眠和监听一次。你可以简单地继续调用recv()。 “如果没有数据可供读取,Receive 方法将阻塞,直到数据可用。”取自 dotnet api 文档。您可以简单地调用 recv() 并等待数据。或者,如果您想在连接上创建某种基于线程的侦听,您可以使用 Windows 中的任何 unix-select 替代方法。但我再次认为没有任何必要
    • Javev- 我已经实现了 server.receive() 方法,但不知道它被阻塞了。我在工作循环中有“if (StopRequest.WaitOne(0))”来检查服务是否已停止,以便我可以关闭服务器连接等。由于我的代码已经阻塞,是否需要 WaitOne()?
    • 假设 C# 的实现紧密遵循伯克利的套接字 API,那么不。无需等待。根据您的实现,您可能遇到的唯一问题是,如果当前线程处于阻塞状态,您何时想要终止进程。
    【解决方案2】:

    想通了。 TcpClient Class 的这条评论让我大吃一惊:

    // Note, for this client to work you need to have a TcpServer
    // connected to the same address as specified by the server, port
    // combination.
    

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多