【发布时间】:2009-12-11 16:03:45
【问题描述】:
我在同一台机器上有一个服务器和客户端程序。服务器是应用程序的一部分——它可以任意启动和停止。当服务器启动时,我希望客户端连接到服务器的侦听套接字。有等待文件系统更改(ReadDirectoryChangesW)和注册表更改(RegNotifyChangeKeyValue)的win32函数-网络更改有类似的吗?我宁愿不让客户端不断轮询。
【问题讨论】:
我在同一台机器上有一个服务器和客户端程序。服务器是应用程序的一部分——它可以任意启动和停止。当服务器启动时,我希望客户端连接到服务器的侦听套接字。有等待文件系统更改(ReadDirectoryChangesW)和注册表更改(RegNotifyChangeKeyValue)的win32函数-网络更改有类似的吗?我宁愿不让客户端不断轮询。
【问题讨论】:
没有这样的 Win32 API,但是这可以通过使用事件轻松完成。客户端将等待该事件发出信号。服务器将在启动时发出事件信号。
您需要使用的相关 API 是 CreateEvent、OpenEvent、SetEvent、ResetEvent 和 WaitForSingleObject。
如果您的服务器将作为服务运行,那么对于 Vista 及更高版本,它将在会话 0 隔离中运行。这意味着您将需要使用名称以“Global\”为前缀的事件。
您可能确实有充分的理由需要此功能,但在实施此功能之前,请考虑:
【讨论】:
考虑使用某种形式的 Windows 同步,例如信号量。客户端可以等待同步原语,服务器可以在启动时发出信号。
【讨论】:
我个人会使用来自服务器的 UDP 广播并让“客户端”监听它。服务器可以在运行时每隔 X 周期广播一个 UDP 数据包,当客户端收到一个数据包时,如果它尚未连接,它可以连接。
这样做的好处是您可以将客户端移动到另一台机器上而不会出现任何问题(并且由于从客户端到服务器的主要连接已经是套接字,因此将客户端和服务器绑定到同一台机器会很遗憾,因为您为初始引导选择了本地 IPC 方法)。
【讨论】: