【问题标题】:Is there a way to wait for a listening socket on win32?有没有办法在win32上等待监听套接字?
【发布时间】:2009-12-11 16:03:45
【问题描述】:

我在同一台机器上有一个服务器和客户端程序。服务器是应用程序的一部分——它可以任意启动和停止。当服务器启动时,我希望客户端连接到服务器的侦听套接字。有等待文件系统更改(ReadDirectoryChangesW)和注册表更改(RegNotifyChangeKeyValue)的win32函数-网络更改有类似的吗?我宁愿不让客户端不断轮询。

【问题讨论】:

    标签: sockets winapi


    【解决方案1】:

    没有这样的 Win32 API,但是这可以通过使用事件轻松完成。客户端将等待该事件发出信号。服务器将在启动时发出事件信号。

    您需要使用的相关 API 是 CreateEventOpenEventSetEventResetEventWaitForSingleObject

    如果您的服务器将作为服务运行,那么对于 Vista 及更高版本,它将在会话 0 隔离中运行。这意味着您将需要使用名称以“Global\”为前缀的事件。

    您可能确实有充分的理由需要此功能,但在实施此功能之前,请考虑:

    • 是否有某些原因您需要立即连接?我认为这不是问题,因为如果您在客户端执行操作,您可以在此时建立新的服务器连接。
    • 服务器的启动和停止是否比客户端更频繁?您可以切换聆听/连接的角色

    【讨论】:

    • 它有点像日志查看器,所以理想情况下,它会尽快运行。我的愿望不是立即连接,而是不必担心投票频率。
    【解决方案2】:

    考虑使用某种形式的 Windows 同步,例如信号量。客户端可以等待同步原语,服务器可以在启动时发出信号。

    【讨论】:

      【解决方案3】:

      我个人会使用来自服务器的 UDP 广播并让“客户端”监听它。服务器可以在运行时每隔 X 周期广播一个 UDP 数据包,当客户端收到一个数据包时,如果它尚未连接,它可以连接。

      这样做的好处是您可以将客户端移动到另一台机器上而不会出现任何问题(并且由于从客户端到服务器的主要连接已经是套接字,因此将客户端和服务器绑定到同一台机器会很遗憾,因为您为初始引导选择了本地 IPC 方法)。

      【讨论】:

        猜你喜欢
        • 2015-11-15
        • 2017-06-24
        • 1970-01-01
        • 2010-10-14
        • 2021-02-14
        • 2021-09-12
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多