ConnectNamedPipe

【勇芳软件工作室】汉化HomePreviousNext

ConnectNamedPipe功能使命名管道服务器进程能够等待客户端进程连接到命名管道的实例。客户端进程通过调用CreateFileCallNamedPipe 函数进行连接。

BOOL ConnectNamedPipe(

HANDLE 【hNamedPipe】,//处理命名管道进行连接
LPOVERLAPPED 【lpOverlapped的】//指向重叠结构的指针
); 

参数

【hNamedPipe】

标识命名管道实例的服务器端。该句柄由CreateNamedPipe函数返回。

【lpOverlapped的】

指向OVERLAPPED结构。

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

备注

命名管道服务器进程可以使用ConnectNamedPipe新创建的管道实例。它也可以与以前连接到另一个客户端进程的实例一起使用;在这种情况下,服务器进程必须首先调用DisconnectNamedPipe函数以将该句柄与先前的客户端断开连接,然后才能将该句柄重新连接到新的客户端。否则,ConnectNamedPipe返回FALSE,如果之前的客户端已关闭其句柄,否则GetLastError返回ERROR_NO_DATA,如果尚未关闭其句柄,则返回ERROR_PIPE_CONNECTED。

ConnectNamedPipe的行为取决于两个条件:管道手柄的等待模式是否设置为阻塞或非阻塞,以及该函数是否被设置为同步执行或重叠模式。服务器最初在CreateNamedPipe功能中指定管道手柄的等待模式,可以使用SetNamedPipeHandleState功能更改。

如果使用FILE_FLAG_OVERLAPPED打开【hNamedPipe】,则【lpOverlapped的】参数不能为NULL。它必须指向一个有效的OVERLAPPED结构。如果使用FILE_FLAG_OVERLAPPED打开【hNamedPipe】,并且【lpOverlapped的】为NULL,则该函数可能会错误地报告连接操作是否完成。

如果【hNamedPipe】使用FILE_FLAG_OVERLAPPED创建,并且【lpOverlapped的】不为NULL,则【lpOverlapped的】指向的OVERLAPPED结构必须包含手动重置事件对象的句柄(服务器可以使用CreateEvent创建的CreateEvent功能)。

如果【hNamedPipe】未使用FILE_FLAG_OVERLAPPED打开,并且【lpOverlapped的】为NULL,则在客户端连接或发生错误之前,该函数不会返回。如果客户端在调用函数后连接,则成功的同步操作会导致返回TRUE的函数。如果客户端在函数调用之前连接,函数返回FALSE,GetLastError返回ERROR_PIPE_CONNECTED。如果客户端在呼叫CreateNamedPipe和调用ConnectNamedPipe之间的间隔期间连接,则可能会发生这种情况。在这种情况下,即使函数返回FALSE,客户端和服务器之间也有良好的连接。

如果【hNamedPipe】未使用FILE_FLAG_OVERLAPPED打开,并且【lpOverlapped的】不为NULL,则操作将异步执行。该函数立即返回值为FALSE。如果客户端进程在函数调用之前连接,GetLastError将返回ERROR_PIPE_CONNECTED。否则,GetLastError返回ERROR_IO_PENDING,表示该操作在后台执行。当这种情况发生时,OVERLAPPED结构中的事件对象在ConnectNamedPipe返回之前被设置为非信号状态,并且当客户端连接到管道实例时,将其设置为信号状态。

服务器进程可以使用任何等待功能SleepEx __来确定事件对象的状态何时发信号,然后可以使用GetOverlappedResult功能确定ConnectNamedPipe操作的结果。

如果指定的管道手柄处于非阻塞模式,则ConnectNamedPipe始终立即返回。在非阻塞模式下,ConnectNamedPipe第一次调用与之前的客户端断开连接的管道实例时,返回TRUE。这表明管道现在可以连接到新的客户端进程。在所有其他情况下,当管道手柄处于非阻塞模式时,ConnectNamedPipe返回FALSE。在这些情况下,如果没有连接客户端,GetLastError返回ERROR_PIPE_LISTENING,如果客户端已连接,则返回ERROR_PIPE_CONNECTED,如果以前的客户端已关闭其管道句柄但服务器尚未断开,则返回ERROR_NO_DATA。请注意,只有在接收到ERROR_PIPE_CONNECTED错误之后,客户端和服务器之间的良好连接才会存在。

请注意,与Microsoft LAN Manager 2.0版兼容,支持非阻塞模式,不应使用命名管道来实现异步输入和输出(I / O)。

也可以看看

CallNamedPipe, CreateEvent, CreateFile, CreateNamedPipe, DisconnectNamedPipe, GetOverlappedResult, SetNamedPipeHandleState, SleepEx, OVERLAPPED