一个命名管道的有关问题

一个命名管道的问题
长连接的命名管道如何接收客户端的IO完成通知。

就是客户端只createfile一次那种

------解决方案--------------------
WaitForSingleObject()
------解决方案--------------------
管道服务端经常要传递管道的名字给它的客户端,这样管道客户端才能连接到管道。否则,管道客户端必须在编译时就得知道管道的名字。
知道名字了就可以在CreateFile函数中指定管道的名字。
使用如下命名格式:

CreateFile(//ServerName/pipe/PipeName)
CreateFile函数允许管道客户端在dwFlagsAndAttributes参数中使用 (FILE_FLAG_WRITE_THROUGH)标志把管道句柄设置为直写模式。但要记住,直写模式的管道句柄一旦创建就不能再更改,并且直写模式对于同一个管道实例,服务端和客户端的句柄可以不同。

------解决方案--------------------
同步和异步(重叠)输入和输出
ReadFile、WriteFile、TransactNamedPipe和ConnectNamedPipe函数可以在命名管道上以同步或异步的方式完成输入和输出操作。当函数以同步方式运行时,函数不会返回直到操作完成为止,这意味着调用线程在完成一个耗时操作时其执行过程可以无限期阻塞。而当函数以异步方式运行时,即使操作没有完成函数也会立即返回,这使得当调用线程释放出来去完成其它任务的同时可以在后台执行耗时的操作。

使用异步I/O可以使管道服务端用一个循环来完成如下步骤:

1.在等待函数(例如:WaitForMultipleObjects)中指定多个事件对象,并等待其中一个事件被设置成信号态。

2.使用等待函数的返回值来确定是哪个重叠操作完成了。

3.完成任务,必要时清除完成操作并为管道句柄初始化下次操作,比如:为同一个管道句柄开启另一个重叠操作。