PIPE_TYPE_MESSAGE | //消息类型管道
PIPE_READMODE_MESSAGE | //邮件阅读模式
PIPE_WAIT,//阻止模式
实例,//实例数
BUFSIZE * sizeof(TCHAR),//输出缓冲区大小
BUFSIZE * sizeof(TCHAR),//输入缓冲区大小
PIPE_TIMEOUT,//客户端超时
NULL); //默认的安全属性
如果(Pipe [i] .hPipeInst == INVALID_HANDLE_VALUE)
{
printf(“ CreateNamedPipe失败,出现%d. \ n”,GetLastError());
返回0;

}
:: CreateIoCompletionPort(Pipe [i] .hPipeInst,hIocpPort,i,0);
//调用子例程以连接到新客户端
bSuccess = ConnectToNewClient(&Pipe [i]);
if(bSuccess == FALSE)
{
CloseHandle(Pipe [i] .hPipeInst);
}
}
完成端口线程是主线程. 它通过调用GetQueuedCompletionStatus获得异步请求的结果,并在提交请求时根据dwState确定请求的类型. 如果它是CONNECTING_STATE,则意味着有一个客户端请求,处理该请求并提交管道以通过ReadFile或WriteFile Request进行读取和写入:
同时(1)
{
bSuccess = GetQueuedCompletionStatus(hIocpPort,&dwNumberOfBytes,&ulCompletionKey,(LPOVERLAPPED *)&pOverlapped,INFINITE);
///如果接受了退出状态,则退出主线程.
if(pOverlapped!= NULL && pOverlapped-> dwState == EXITING_STATE)
{
休息;
}
OPRESULT opResult = {0};
opResult.bResult = bSuccess;
opResult.dwBytesTransferred = dwNumberOfBytes;
opResult.ulCompletionKey = ulCompletionKey;
OnOperationComplete(opResult,pOverlapped);
}
 
管道客户端首先输入管道实例名称,以通过CreateFile连接到管道服务器. 如果服务器繁忙且无法建立连接,请通过WaitNamedPipe等待超时,或者直到命名管道具有可用的连接. 写入和读取被WriteFile和ReadFile阻止的管道的内容;
与命名管道服务器建立连接:
同时(1)
{
hPipe = CreateFile(
g_namedpipe_name,//管道名称
GENERIC_READ | //读写访问权限
GENERIC_WRITE,
0,//不共享
NULL,//默认安全属性
OPEN_EXISTING,//打开现有管道
0,//默认属性
NULL); //没有模板文件
//如果管道手柄有效,则中断.
如果(hPipe!= INVALID_HANDLE_VALUE)
休息;

//如果发生ERROR_PIPE_BUSY以外的错误,则退出.
如果(GetLastError()!= ERROR_PIPE_BUSY)
{
_tprintf(TEXT(“无法打开管道. GLE =%d \ n”),GetLastError());
返回-1;
}
//所有管道实例都处于繁忙状态,因此请等待20秒.
if(!WaitNamedPipe(g_namedpipe_name,20000))
{
printf(“无法打开管道: 20秒等待超时. ”);
返回-1;
}
}
将数据发送到管道缓冲区:
fSuccess = WriteFile(
hPipe,//管道句柄
lpvMessage,//消息
cbToWrite,//消息长度
&cbWritten,//写入的字节
NULL); //不重叠
循环读取命名管道缓冲区的内容:
做
{
//从管道读取.
chBuf [BUFSIZ-1] = _T('\ 0');
fSuccess = ReadFile(
hPipe,//管道句柄
chBuf,//接收回复的缓冲区
(BUFSIZ-1)* sizeof(TCHAR),//缓冲区的大小
&cbRead,//读取的字节数
NULL); //不重叠
如果(!fSuccess && GetLastError()!= ERROR_MORE_DATA)
{
printf(“ ReadFile错误为: %d \ n”,GetLastError());
休息;
}
_tprintf(TEXT(“%s”),chBuf);
} while(!fSuccess); //如果ERROR_MORE_DATA重复循环
使用后调用CloseHandle关闭并释放管道设备;
结束
查看代码:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-288048-2.html
打到他投降好不好