vc++管道通信

最近在迁移管道通信的代码到c#程序,发现了一个很郁闷的问题,两个标准的client和server,明明看到帮助文档中存在阻塞模式,而且是一帮人在查找非阻塞模式的使用,但是根据我调试程序的结果却发现,即使没指定overlapped,程序在readfile、writefile时候依然即时返回,很是奇怪,终于看到如下说明:

二、程序设计的注意事项

  1.如果命名管道客户端已打开,函数将会强迫关闭管道,用disconnectnamedpipe关闭的管道,其客户端还必须用closehandle来关闭最后的管道。

  2. readfile和writefile的hfile句柄是由createfile及connectnamedpipe返回得到。

  3.一个已被某客户端连接的管道句柄在被另一客户通过connectnamedpipe建立连接之前,服务端必须用disconnectnamedpipe函数对已存在的连接进行强行拆离。服务端拆离管道会造成管道中数据的丢失,用flushfilebuffers函数可以保证数据不被丢失。

  4.命名管道服务端可以通过新创建的管道句柄或已被连接过其他客户的管道句柄来使用connectnamedpipe函数,但在连接新的客户端之前,服务端必须用函数disconnectnamedpipe切断之前的客户句柄,否则connectnamedpipe 将会返回false。

  5.阻塞模式,这种模式仅对“字节传输管道"操作有效,并且要求客户端与服务端不在同一机器上。如果用这种模式,则只有当函数通过网络向远端计算机管道缓冲器写数据成功时,才能有效返回。如果不用这种模式,系统会运行缺省方式以提高网络的工作效率。

  6.用户必须用file—create—pipe—instance 来访问命名管道对象。新的命名管道建立后,来自安全参数的访问控制列表定义了访问该命名管道的权限。所有命名管道实例必须使用统一的管道传输方式、管道模式等参数。客户端未启动,管道服务端不能执行阻塞读操作,否则会发生空等的阻塞状态。当最后的命名管道实例的最后一个句柄被关闭时,就应该删除该命名管道。

原文地址:https://www.cnblogs.com/rainbowzc/p/1794335.html