【发布时间】:2011-12-28 23:28:28
【问题描述】:
我不知道为什么会这样……我有一个命名管道服务器和客户端应用程序。两者都处于读/写模式并在彼此之间传输数据。服务器有两个线程,一个从管道读取,一个向它写入。当客户端正在写入一堆消息时,服务器的读取线程将退出,因为它对 PeekNamedPipe 的调用返回 false。 GetLastError() 的返回值为 ERROR_BROKEN_PIPE。服务器中的两个线程都没有关闭管道,客户端仍在写入管道,所以我不明白为什么管道“坏了”。
如果我将服务器更改为 BYTE 模式,那么一切都会完美无缺。我真的很想使用消息模式,所以我的“消息”不会组合在一起。
如果我将客户端更改为 BYTE 模式,将服务器更改为消息模式,它可以工作。
调用 CreateNamedPipe
hPipe = CreateNamedPipe(
pszPipeName,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_WAIT | PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE,
PIPE_UNLIMITED_INSTANCES,
dwOutBufferSize,
dwInBufferSize,
0,
NULL);
调用 PeekNamedPipe
while( RunningState == DDCMP_STATE_RUNNING )
{
if( !PeekNamedPipe(hPipe,NULL,NULL,NULL,&dwBytesAvailable,NULL) || !dwBytesAvailable )
if( GetLastError() == ERROR_BROKEN_PIPE || GetLastError() == ERROR_PIPE_NOT_CONNECTED || GetLastError() == ERROR_INVALID_HANDLE )
break;
else
{
Sleep( 100 );
continue;
}
//call to ReadFile(hPipe,...) with dwBytesAvailable as size, and then processing of data
}
【问题讨论】:
-
你在任何地方打电话给 ConnectNamedPipe 吗?
标签: c++ winapi named-pipes