Windows命名管道和应用程序(2)

电脑杂谈  发布时间:2020-07-25 18:03:18  来源:网络整理

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...