一些真实的代码,用于演示GUI应用程序中管道服务器端的异步使用:

void wait_for_object(HANDLE object)

{

DWORD dw;

MSG msg;

for (;;)

{

dw = MsgWaitForMultipleObjectsEx(1, &object, INFINITE, QS_ALLINPUT, 0);

if (dw == WAIT_OBJECT_0) break;

if (dw == WAIT_OBJECT_0 + 1)

{

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg);

continue;

}

srvfail(L"sleep() messageloop", GetLastError());

}

}

HANDLE server_pipe;

HANDLE io_event;

void pipe_connection(void)

{

OVERLAPPED overlapped;

DWORD dw, err;

SecureZeroMemory(&overlapped, sizeof(overlapped));

overlapped.hEvent = io_event;

if (!ReadFile(server_pipe, input_buffer, sizeof(input_buffer) - 1, NULL, &overlapped))

{

err = GetLastError();

if (err == ERROR_IO_PENDING)

{

wait_for_object(io_event);

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"Read from pipe failed asynchronously.", GetLastError());

}

}

else

{

srvfail(L"Read from pipe failed synchronously.", GetLastError());

}

}

else

{

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"GetOverlappedResult failed reading from pipe.", GetLastError());

}

}

input_buffer[dw] = '\0';

process_command();

if (!WriteFile(server_pipe, &output_struct,

((char *)&output_struct.output_string - (char *)&output_struct) + output_struct.string_length,

NULL, &overlapped))

{

err = GetLastError();

if (err == ERROR_IO_PENDING)

{

wait_for_object(io_event);

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"Write to pipe failed asynchronously.", GetLastError());

}

}

else

{

srvfail(L"Write to pipe failed synchronously.", GetLastError());

}

}

else

{

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"GetOverlappedResult failed writing to pipe.", GetLastError());

}

}

if (!FlushFileBuffers(server_pipe)) srvfail(L"FlushFileBuffers failed.", GetLastError());

if (!DisconnectNamedPipe(server_pipe)) srvfail(L"DisconnectNamedPipe failed.", GetLastError());

}

void server(void)

{

OVERLAPPED overlapped;

DWORD err, dw;

// Create the named pipe

server_pipe = CreateNamedPipe(pipe_name, PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, buffer_size, buffer_size, 0, NULL);

if (server_pipe == INVALID_HANDLE_VALUE) srvfail(L"CreateNamedPipe failed.", GetLastError());

// Wait for connections

io_event = CreateEvent(NULL, FALSE, FALSE, NULL);

if (io_event == NULL) srvfail(L"CreateEvent(io_event) failed.", GetLastError());

for (;;)

{

SecureZeroMemory(&overlapped, sizeof(overlapped));

overlapped.hEvent = io_event;

if (!ConnectNamedPipe(server_pipe, &overlapped))

{

err = GetLastError();

if (err == ERROR_PIPE_CONNECTED)

{

pipe_connection();

}

else if (err == ERROR_IO_PENDING)

{

wait_for_object(io_event);

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"Pipe connection failed asynchronously.", GetLastError());

}

pipe_connection();

}

else

{

srvfail(L"Pipe connection failed synchronously.", GetLastError());

}

}

else

{

if (!GetOverlappedResult(server_pipe, &overlapped, &dw, FALSE))

{

srvfail(L"GetOverlappedResult failed connecting pipe.", GetLastError());

}

pipe_connection();

}

}

}

(此代码已从原始代码中删除以删除无关的逻辑。我没有尝试编译编辑版本,因此可能存在一些小问题。还要注意使用全局变量,这在我的情况下可以,因为应用程序非常小,但通常应该避免。)

使用MsgWaitForMultipleObjectsEx()可以在等待I / O完成时处理窗口消息。 如果你还在等待其他事情发生,你可以传递一个句柄数组而不只是一个句柄 - 例如,如果你想监视一个子进程并在它退出时做一些事情,你可以传递一个包含io_event和进程句柄。 如果您只是需要定期执行其他工作,可以设置等待超时,或使用窗口计时器。

中断和执行子服务器,windows - 命名管道服务器,如何中断或超时等待客户端连接和传入数据 - 堆栈内存溢出...相关推荐

  1. 浅析Windows命名管道Named Pipe

    目录 管道 命名管道Names Pipes 查看管道列表 命名管道的创建与访问 命名管道的利用 绕过防火墙 模拟令牌(System权限) C2 信道 MS17010和Named Pipe 管道 讲命令 ...

  2. windows命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节. 将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据.命名管道服务器和客户机的区别在于:服务器 ...

  3. windows命名管道使用方法

    原文地址:https://www.cnblogs.com/lsh123/p/7435401.html 命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节. 将命名管道作为一种网络编程方案 ...

  4. C# 创建命名管道服务器

    通过创建 NamedPipeServerStream 的一个新实例,来创建服务器.NamedPipeServerStream 派生自基类 PipeStream,PipeStream 派生自 Strea ...

  5. Windows 命名管道 + 异步I/O模型

    一.管道 + 异步I/O 本地通讯模型 1.客户端操作 发送请求 (1) 互斥上锁 CreateMutex, WaitForSingleObject (2) 打开命名管道 OpenNamedPipe ...

  6. 上下文保存 中断_从操作系统(Windows)的角度讨论中断和异常机制

    本章的内容是针对Windows XP的32位版本的,但是绝大多数内容也适用于Windows的其他32位版本(Windows NT.Windows 2000和Windows Vista),并且可以比较容 ...

  7. xp系统如何开启索引服务器,windows xp 索引服务器

    windows xp 索引服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. ...

  8. 高级卸载系统服务器,windows系统卸载服务器

    windows系统卸载服务器 内容精选 换一换 密钥对鉴权方式的Windows云服务器,使用私钥文件获取登录密码失败.出现获取密码失败一般原因是Cloudbase-init注入密码失败. Cloudb ...

  9. windows系统中nginx图片服务器,windows nginx 图片服务器

    windows nginx 图片服务器 内容精选 换一换 为了保证使用私有镜像创建的新云服务器可以通过"用户数据注入"功能注入初始化自定义信息(例如为云服务器设置登录密码),建议您 ...

最新文章

  1. Windows 路由追踪tracert命令使用示例
  2. 结合传统与数字技术,构建逼真的机械设计
  3. Math中的常用方法
  4. 一文读懂DataOps
  5. iOS开发ARC内存管理
  6. 【报告分享】二次元衍生创作行业报告.pdf(附下载链接)
  7. 吴恩达机器学习【第三天】线性代数基础知识
  8. python字符串find方法(二分钟读懂)
  9. linux 安装servlet环境_linux下一键搭建LAMP环境安装网站全教程
  10. 判断单链表是否存在环及环的入口点
  11. C++“”字符与字符“”相加是连接
  12. VS2003驱动开发环境配置
  13. 懒人查看python源码方法
  14. python动态人脸识别_Python动态人脸识别
  15. 华为交换机初始化_华为交换机的初始配置
  16. 学习笔记12-SG90舵机
  17. VS2003添加.BMP资源
  18. matlab仿真整流电路设计,整流电路MATLAB仿真实验
  19. 如何加密文件及文件夹
  20. android 百度地图驾车导航,百度地图API详解之驾车导航

热门文章

  1. JS对象 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
  2. 显著性水平对应的临界值_什么是临界值?
  3. mysql去空缺排序
  4. 王者无限火力服务器,王者荣耀#无限火力:真正的无限火力,键入这句代码才能开启...
  5. python进阶(二)——request 爬取中国最好大学排名
  6. Redis分布式集群部署安装及细节(多主机搭建集群开启多个服务)
  7. The History of Tcl/Tk
  8. 哪款蓝牙耳机性价比高?捷波朗Elite 75t和南卡A2降噪蓝牙耳机测评
  9. 自定义一个时钟的显示效果
  10. Spring源码深度解析(郝佳)-学习-源码解析-Spring MVC(一)