Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 有没有办法在win32上等待侦听套接字?_Sockets_Winapi - Fatal编程技术网

Sockets 有没有办法在win32上等待侦听套接字?

Sockets 有没有办法在win32上等待侦听套接字?,sockets,winapi,Sockets,Winapi,我在同一台机器上有一个服务器和客户端程序。服务器是应用程序的一部分,它可以任意启动和停止。当服务器启动时,我希望客户端连接到服务器的侦听套接字。有win32函数等待文件系统更改(ReadDirectoryChangesW)和注册表更改(RegNotifyChangeKeyValue)-网络更改有类似的功能吗?我不希望客户端不断轮询。考虑使用某种形式的Windows同步,例如信号量。客户端可以等待同步原语,服务器可以在同步原语启动时发出信号。没有这样的Win32 API,但是这可以通过使用事件轻松

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

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

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

您需要使用的相关API是、和

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

您可能有一个很好的理由需要这样做,但在实施之前,请考虑:

  • 你有什么理由需要马上联系吗?我认为这不是问题,因为如果您在客户机中执行某个操作,那么此时您可以建立一个新的服务器连接
  • 服务器是否比客户端更频繁地启动和停止?您可以切换侦听/连接用户的角色

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


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

它有点像日志查看器,所以理想情况下,它会尽快运行。我的愿望与其说是立即联系,不如说是不必担心多久投票一次。