Windows Named Pipe 如何提前终止ConnectNamedPipe的同步等待
2024-08-24
82
问题描述
在Windows中使用命名管道Named Pipe进行跨进程通信时,在Server端用ConnectNamedPipe同步等待(非异步模式),如果没有Client连接,这个等待就会一直进行下去,等待过程中调用CloseHandle尝试关闭Pipe的句柄,CloseHandle也会被阻塞掉,有时候我们希望提前结束ConnectNamedPipe怎么办呢?
解决办法
ConnectNamedPipe的同步等待,只有当有Client通过CreateFile的方式进行连接时,才会退出,所以,我们通过CreateFile和额外的Event来提前终止连接,首先在初始时创建Event:
g_NamedPipeStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (g_NamedPipeStopEvent == NULL)
{
//error processing
}
然后,创建如下函数:
void StopNamedPipe()
{
SetEvent(g_NamedPipeStopEvent);
HANDLE hPipe = CreateFile(pipeName,
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hPipe != INVALID_HANDLE_VALUE) {
CloseHandle(hPipe);
}
}
这个函数的功能就是在当我们要提前终止ConnectNamedPipe时调用,在ConnectNamedPipe处修改代码如下:
BOOL ret = ConnectNamedPipe(pipeHandle, NULL); //阻塞等待客户端连接。
if (WaitForSingleObject(g_NamedPipeStopEvent, 0) == WAIT_OBJECT_0) {
//执行到这里表示是通过调用StopNamedPipe()连接的,则这里开始执行退出的操作
return 0;
}
总结
ConnectNamedPipe同步方式,除了通过CreateFile进行连接以外,没有其他方法能够提前终止,我们通过Event是否被Set,来判断到底是正常的Client连接还是调用了StopNamedPipe()函数,希望提前终止,从而间接实现了提前终止ConnectNamedPipe的功能。
更新于:2个月前赞一波!4
相关文章
- WinToUSB | 把Windows塞进U盘里即插即用
- windows桌面应用GUI框架选择及其优缺点
- Web网页版Windows源码
- Windows 系统 PhpStorm 2020无限试用30天
- windows 安装 redis 详细步骤
- windows 下 PHP 的 redis 扩展安装
- Windows中通过BAT写注册表给exe增加管理员权限运行
- Windows 下 exe 服务注册到 service 服务中
- 在 Windows 上安装 Composer
- 在Windows上安装PHP(将PHP加载到Apache中)
- C#的网站通过Windows性能计数器监测服务器的性能
- 在Windows 10计算机上安装Python的最佳方法是什么?
- MySQL社区版5.x最新版安装包下载(Windows版本)
- Windows 11自带轻量级虚拟机Windows Sandbox(沙盒)
- Windows所有组合快捷键大全
- C#获取Windows系统中所有已安装软件的名称和版本号
- 在64位的Windows系统下运行32位的C#程序如何控制重定向
- .NET部署到Linux和Windows哪个性能更高?
- 如何在 Python 中终止 Windows 上运行的进程?
- Windows中如何通过网络远程运行另外一台Windows的界面程序
文章评论
评论问答