今天准备课设,看了一下命名通道,讲讲命名通道工作流程
记住这里管道也是破坏性地读
首先调用CreateNamedPipe来创建管道,第一个参数指定管道的名字,第二个参数指定打开的模式,比如说单向地读,单向地写,双向读写之类的属性,这DEMO中指定的是hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\laipipe"),
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
可双向读写管道heFILE_FLAG_OVERLAPPED,第三个参数是否指定管道模式,往里面送数据是字节类型,还是数据块形式(window里面叫消息流),还有指定Blocking mode is enabled. When the pipe handle is specified in the ReadFile, WriteFile, or ConnectNamedPipe function,其实这里指定的0是个组合,有三个标志同时背指定,可以查看MSDN
第四个参数是指定最大连接实例,注意管道任何时刻都只可以和一个管道通信,OK!!,第四个,第五个参数指定输入输出缓冲区和输出缓冲区的大小,地六个参数指定超时事件,
The default time-out value, in milliseconds, if the WaitNamedPipe function specifies NMPWAIT_USE_DEFAULT_WAIT. Each instance of a named pipe must specify the same value.,所以这个参数是后面用WaitNamedPipe来检测是否有管道可用的时候,如果第二个参数是用NMPWAIT_USE_DEFAULT_WAIT,那么每一个实例指定的默认值就是次参数指定的,因为后面我们用永远等待,所以这个参数值对于我们这个DEMO来说是没有意义的,所以设置为0
第六个参数是安全性描述符,设置为NULL,所以使用默认安全性描述符
,创建管道是服务器干的事情,那么创建完服务器端之后,服务器就开始等待客户端的连接请求了,
因为前面我们指定了FILE_FLAG_OVERLAPPED标志,所以在CONNECTNAMEPIPE函数的时候,第二个参数OVERLAPPPED参数,首先要注意全部清零,避免影响我们的程序,然后用次结构体中的一个事件参数,hEVENT,当有连接建立成功之后,就把这个信号设置为有效的。通过调用WaitForSingleObject来判断是否该信号有效,客户端事情基本结束了
记住,因为前面指定参数时候为一直等待,所以在创建连接后,服务器端会自我阻塞,直到有连接请求为止,
程序好像死了一样
我靠,饿死了,
再写一下客户端
客户端首先调用WaitNamedPipe来判断是否有连接可以请求,如果有则返回,否则可以通过指定第二个参数来指定处理方式
然后通过调用CreateFile来打开管道,返回一个句柄,用于读写,在CreateFile中可以指定打开i方式,
这里就不多说了
吃去了
OK ,命名管道不仅可以用于同一台主机上两个进程间通信,还可以用与不同主机两个,进程间的通信