网络编程学习笔记之命名管道(上)

来源:互联网 发布:简述网络舆情的特点 编辑:程序博客网 时间:2024/04/29 01:26

1,命名管道的命名规范: //server/Pipe/[path]name

2,命名管道的通信模式: 字节模式和消息模式

3,建立一个基本的命名管道服务器: 1) 使用A P I函数C r e a t e N a m e d P i p e,创建一个命名管道实例句柄; 2) 使用A P I函数C o n n e c t N a m e d P i p e,在命名管道实例上监听客户机连接请求; 3) 分别使用R e a d F i l e和Wr i t e F i l e这两个A P I函数,从客户机接收数据,或将数据发给客户机; 4) 使用A P I函数D i s c o n n e c t N a m e d P i p e,关闭命名管道连接; 5) 使用A P I函数C l o s e H a n d l e,关闭命名管道实例句柄。

4,建立一个基本的客户机: 1) 用A P I函数Wa i t N a m e d P i p e,等候一个命名管道实例可供自己使用; 2) 用A P I函数C r e a t e F i l e,建立与命名管道的连接; 3) 用A P I函数Wr i t e F i l e和R e a d F i l e,分别向服务器发送数据,或从中接收数据; 4) 用A P I函数C l o s e H a n d l e,关闭打开的命名管道会话。

5,相关函数参数说明:

 HANDLE CreateNamedPipe ( LPCTSTR lpname, 指定命名管道的名字              DWORD dwOpenMode, 指定传输方向,I/O控制,  和安 全模式                                DWORD dwPipeMode, 指定管道的读写和等待模式                                                DWORD nMaxInstances, 指定创建的实例个数DWORD nOutBufferSize, 指定内部输出缓冲区的大小 DWORD nInBufferSize, 指定内部输入缓冲区的大小 DWORD nDefaultTimeout, 指定默认的超时时间 LPSECURITY_ATTRIBUTES lpSecurityAttributes 指定一个安全描述符 );

BOOL ConnectNamedPipe ( HANDLE hNamedPipe, 指定CreateNamedPipe函数返回的命名管道句柄 LPOVERLAPPED lpOverLapped 指定函数工作方式 );

BOOL WaitNamedPipe ( LPCTSTR lpNamedPipeName, 指定企图与其建立连接的命名管道服务器 DWORD nTimeOut 指定指定客户机需要等待一个管道的服务器进程多久的时间,让它在管道上完成一 个待决的C o n n e c t N a m e d P i p e操作 );

HANDLE CreateFile ( LPCTSTR lpFileName, 指定希望打开的命名管道的名字 DWORD dwDesiredAccess, 指定访问模式,访问模式必须兼容于管道当初在服务器上的创建方式 DWORD dwSharedMode, 为0,因为一次只能有一个客户机访问一个管道实例 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 应设为NULL,除非需要子进程继承客户机的句柄 DWORD dwCreationDisposition, 应设为OPEN_ EXISTING,意味着CreateFile函数会 在命名管道不存在的情况下调用失败 DWORD dwFlagsAndAttributes, 设为F I L E _ AT T R I B U T E _ N O R M A L HANDLE hTempleteFile 它对命名管道无效,应设为N U L L );

BOOL CallNamedPipe ( LPCTSTR lpNamedPipeName, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesRead, DWORD nTimeOut );
lpNamedPipeName参数包含的是一个字串,采用UNC名字格式,指定了一个命名管道。lpInBufferr和nInBufferSize参数分别指定一个缓冲区的地址与大小,应用程序打算用这个缓冲区将数据写入服务器。lpOutBuffer和nOutBufferSize则指定了另一个缓冲区的地址和大小,不过应用程序用它从服务器那里接收数据。在lpBytesRead参数中,包含了从管道读回的字节数。而nTimeOut指定的是一个时间长度,以毫秒为单位,规定了在一个命名管道可用之前,最长能等待多久的时间.该函数只能在客户机上使用.
 
BOOL TransactNamedPipe ( HANDLE hNamedPipe, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesRead, LPOVERLAPPED lpOverlapped );
h N a m e d P i p e参数指定的是由C r e a t e N a m e d P i p e或C r e a t e F i l e这两个A P I函数返回的命名管道。l p I n B u ff e r和n I n B u ff e r S i z e参数指定一个缓冲区的地址和大小,应用程序用这个缓冲区将数据写入管道。l p O u t B u ff e r和n O u t B u ff e r S i z e参数指定的则是另一个缓冲区的地址和大小,应用程序利用这个缓冲区从管道取得数据。l p B y t e s R e a d参数用于接收自管道读回的实际字节数量。l p O v e r l a p p e d参数允许这个Tr a n s a c t N a m e d P i p e使用重叠式I / O,以异步形式工作。
 
BOOL GetNamedPipeHandleState ( HANDLE hNamedPipe, LPDWORD lpState, LPDWORD lpCurInstances, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeoout, LPTSTR lpUserName, DWORD nMaxUserNameSize );
h N a m e d P i p e参数指定的是由C r e a t e N a m e d P i p e或C r e a t e F i l e这两个A P I函数返回的一个命名管道。l p S t a t e参数是一个变量指针,那个变量负责接收管道句柄的当前工作模式。l p S t a t e参数可能返回两个值,一个是P I P E _ N O WA I T,另一个是P I P E _ R E A D M O D E _ M E S S A G E。l p C u r I n s t a n c e s参数也是一个变量指针,那个变量负责当前的管道实例数量。l p M a x C o l l e c t i o n C o u n t参数负责接收实际发送给服务器之前,打算在客户机上收集的最大字节数。l p C o l l e c t D a t a Ti m e o u t参数接收的则是一个时间值,以毫秒为单位。超过这个时间,一个远程命名管道便必须通过网络传出信息。l p U s e r N a m e和n M a x U e r N a m e S i z e参数定义的是一个缓冲区,它负责接收一个“空中止”的字串,其中包含了客户机应用的用户名字串
BOOL SetNamedPipeHandleState ( HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWOED lpCollectDataTimeOut );
h N a m e d P i p e参数指定的是由C r e a t e N a m e d P i p e或C r e a t e F i l e这两个A P I函数返回的一个命名管道。l p M o d e参数设置管道的工作(运行)模式。l p M a x C o l l e c t i o n C o u n t参数指定的是客户机上收集的最大字节数量,随后数据便需发给服务器。l p C o l l e c t D a t a Ti m e o u t参数以毫秒为单位指定了一个时间值,该值指明一个远程命名管道客户机通过网络传送信息之前,最多需等待的时间
 
BOOL GetNamedPipeInfo ( HANDLE hNamedPipe, LPDWORD lpFlags, LPDWORD lpOutBufferSize, LPDWORD lpInBufferSize, LPDWORD lpMaxInstances );
h N a m e d P i p e参数指定的是由C r e a t e N a m e d P i p e或C r e a t e F i l e这两个A P I函数返回的一个命名管道。l p F l a g s参数取得命名管道的类型,并判断它到底是一个服务器,还是一个客户机,以及管道工作于字节模式,还是消息模式。l p O u t B u ff e r S i z e参数以字节为单位,指定了用来保存外出数据的内部缓冲区的大小; l p I n B u ff e r S i z e参数则以字节为单位,取得用于保存进入数据的内部缓冲区的大小。l p M a x I n s t a n c e用于取得可以创建的管道实例的最大数量。
 
BOOL PeekNamedPipe ( HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage );
h N a m e d P i p e参数用于指定由C r e a t e N a m e d P i p e或C r e a t e F i l e这两个A P I函数返回的一个命名管道。l p B u ff e r和n B u ff e r S i z e参数分别定义的是一个接收专用缓冲区的地址及大小,用于从管道取得数据。l p B y t e s R e a d 参数负责接收从管道实际读入缓冲区的字节数量。 l p To t a l B y t e s Av a i l参数用于接收可从管道发出的字节总数。l p B y t e s L e f t T h i s M e s s a g e参数用于接收消息内尚存的字节数量(前提是管道用消息模式打开)。假如一条消息的实际长度大于由 l p B u ff e r参数指定的那个缓冲区的长度,消息内剩下的字节便会返回。对于在字节模式下工作的命名管道而言,该参数则无论如何都会返回0
原创粉丝点击