进程间通讯 —— 命名管道

管道包括三种:windows

1):普通管道PIPE,一般有不少限制,一是半双工,只能单向传输,二是只能在父子进程间使用安全

2):流管道:这种能双向传输,可是也是只能父子进程间使用。服务器

3):命名管道,去除了以上的第二种限制,能够在许多不相关的进程间进行通信。也是半双工的通讯方式。网络

  一般咱们把管道分为匿名管道和命名管道。但对于匿名管道的话,只能在本机上进程之间通讯,并且只能实现本地的父子进程之间的通讯,局限性太大了。命名管道,就和匿名管道有些不一样了,在功能上也就显得强大许多,至少其能够实现跨网络之间的进程的通讯,同时其客户端既能够接收数据也能够发送数据,服务器端也是能够接收数据,又能够发送数据。异步

 

匿名管道的概述函数

  对于匿名管道而言,命名管道使用了windows安全机制,于是命名管道的服务器端能够控制哪些客户有权与其创建链接。哪些客户端是不可以与这个命名管道创建链接的。命名管道的通讯是以链接的方式进行的,服务器建立一个命名管道对象,而后在此对象上等待链接请求,一旦客户链接过来,则二者均可以经过命名管道读或者写数据。测试

    命名管道提供了两种通讯模式:字节模式和消息模式。在字节模式下,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式下,客户机和服务器则经过一系列不连续的数据单位,进行数据的收发,每次在管道上发出一个消息后,它必须做为一个完整的消息读入。spa

 

命名管道的使用步骤指针

  服务器端:code

1):服务器进程调用CreateNamedPipe函数来建立一个有名称的命名管道在建立命名管道的时候必须指定一个本地的命名管道名称。windows容许同一个本地的命名管道名称右多个命名管道实例。因此,服务器进程在调用CreateNamedPipe函数时必须指定最大容许的实例数(0-255).若是CreateNamedPipe函数成功返回后,服务器进程获得一个指向一个命名管道实例的句柄。

2):服务器进程就能够调用ConnectNamedPipe来等待客户的链接请求,这个ConnectNamedPipe既支持同步形式,又支持异步形式,若服务器进程以同步形式调用 ConnectNamedPipe函数,若是没有获得客户端的链接请求,则会一直等到客户端的链接请求。当该函数返回时,客户端和服务器之间的命名管道链接已经创建起来了。

3):这个时候服务器端就能够向客户端读(ReadFile)/写(WriteFile)数据了。

4):在已经创建链接的命名管道实例中,服务器进程就会获得一个指向该管道实例的句柄,这个句柄称之为服务器端句柄,同时服务端进程能够调用DisconnectNamedPipe函数,将一个管道实例与当前创建链接的客户端进程断开,从而能够从新链接到新的客户端进程。固然,服务器也能够调用CloseHandle来关闭一个已经创建链接的命名管道实例。

 

客户端:

1):客户端进程调用CreateFile函数链接到一个正在等待链接的命名管道上。在这里客户端须要指定将要链接的命名管道上。当CreateFile成功返回以后,客户端就获得了一个指向已经创建链接的命名管道实例的句柄。在这里客户端也能够先调用WaitNamedPipe函数来测试指定名称的管道实例是否可用。在已经创建的命名管道实例中,客户端进程就会获得一个指向该管道实例的句柄。这个句柄称之为客户端句柄。

2):这个时候客户端就能够向服务器读(ReadFile)/写(WriteFile)数据了.

3):客户端能够调用CloseHandle来关闭一个已经创建链接的命名管道实例。

 

 

CreateNamedPipe:

 1 //建立命名管道的函数的使用
 2 CreateNamedPipe("\\\\.\\Pipe\\Test",PIPE_ACCESS_DUPLEX,PIPE_NOWAIT,10,1024,1024,100,NULL)  3 1、为建立的管道命名  4 2、指定管道的访问方式、重叠方式、写直通方式以及管道句柄的安全访问方式(PIPE_ACCESS_DUPLEX这里指双向模式)  5 3、指定管道句柄的类型、读取和等待方式(PIPE_NOWAIT指容许非阻塞方式)  6 4、指定管道可以建立的实例的最大数目  7 5、指定为输出缓冲区所保留的字节数  8 6、指定为输入缓冲区所保留的字节数  9 7、指定默认超时时间,单位ms,同一管道的不一样实例指定值须要相同 10 8、指向SECURITY_ATTRIBUTES结构的指针,该结构指定了命名管道的安全描述符

   该函数用来建立一个命名管道的实例,并返回这个命名管道的句柄。若是须要建立一个命名管道的多个实例,就须要屡次调用CreateNamedPipe函数,参数 lpName 为一个字符串,其格式必须为 \\.\pipe\pipeName,其中圆点 ”.” 表示的是本地机器,若是想要与远程的服务器创建链接,那么这个圆点位置处应指定这个远程服务器的名称,而其中的 “pipe” 这个是个固定的字符串,也就是说不能进行改变的,最后的 “pipename” 则表明的是我将要建立的命名管道的名称了,参数 dwOpenMode 用来指定管道的访问方式,重叠方式,写直通方式,还有管道句柄的安全访问方式。

ConnectNamedPipe:

1 //服务器等待客户端的链接请求的到来(并不是链接服务器端的命名管道!)
2 ConnectNamedPipe(hPipe, NULL) 3 1、指向一个命名管道实例的服务器的句柄,该句柄由CreateNamedPipe函数返回 4 2、指向OVERLAPPED结构体的指针,默认为NULL,代表使用默认的同步IO方式
接收客户端发送数据ReadFile & 向客户端发送数据WriteFile:
1 //文件的写入
2 WriteFile(hPipe, strMessage, sizeof(strMessage), &wLen, 0) 3 
4 1、指定要写入数据的文件的句柄 5 2、指向包含将要将要写入文件的数据的缓冲区的指针 6 3、指明要向文件中写入的字节数 7 4、用来接收实际写入到文件中的字节数 8 5、指向OVERLAPPED结构体的指针,默认为NULL,代表使用默认的同步IO方式

 

//文件的读取

1 ReadFile(hPipe, buf, 256, &rLen, NULL) 2 1、指定要读取数据的文件的句柄 3 2、指向包含将要将要接收的文件中读取数据的缓冲区的指针 4 3、指明要向文件中读取的字节数 5 4、用来接收实际读取到的字节数 6 5、指向OVERLAPPED结构体的指针,默认为NULL,代表使用默认的同步IO方式


CloseHandle:

CloseHandle(hPipe);    //关闭管道句柄 

 



客户端单独用到的两个函数

WaitNamedPipe:

1 WaitNamedPipe(TEXT("\\\\.\\Pipe\\pipeTest"), NMPWAIT_WAIT_FOREVER) 2 1、指定命名管道的名称 3 2、指定超时间隔,NMPWAIT_WAIT_FOREVER表示一直等待,直到出现了一个可用的命名管道的实例

 


CreateFile:

CreateFile("\\\\.\\Pipe\\Test",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 1、指定用于建立或打开的对象的名称 2、指定对象的访问方式,GENERIC_WRITE表示指定对象具备写访问 3、指定共享方式,若是此参数为0,表示对象不能被共享 4、指向SECURITY_ATTRIBUTES结构的指针,该结构指定了命名管道的安全描述符,若是没有特殊的需求,默认值为NULL 5、指定如何建立文件(OPEN_EXISTING表示打开文件,若是文件不存在,则函数调用失败) 6、设置文件属性和标志(FILE_ATTRIBUTE_NORMAL表示该文件没有其余属性设置) 7、指定具备GENERIC_READ访问方式的模板文件的句柄
相关文章
相关标签/搜索