Проблема с именованным каналом Windows: альтернативный код ошибки 233

Мне нужна помощь по моему приложению, которое я создаю. Это простая программа, которая реагирует на параметры командной строки. Если приложение вызывается впервые, он запускается как конвейерный сервер (блокирующий, неперекрывающийся) в другом потоке, посвященном ему, в то время как основной поток делает что-то еще. Теперь пользователь по-прежнему может вызывать приложение, используя тот же исполняемый файл приложения и параметры командной строки, но поскольку это не первый экземпляр приложения, он передает параметры командной строки первому экземпляру с помощью конвейера, а затем уничтожает сам. Итак, это похоже на одноэлементный процесс в «patterns-lingo».

В идеале это должно быть так:

app.exe "first"    // starts app.exe as a pipe server and prints "first"
app.exe "second"   // client process causes server instance to print "second"
app.exe "third"    // client process causes server instance to print "third"
app.exe "fourth"   // client process causes server instance to print "fourth"
app.exe "fifth"    // client process causes server instance to print "fifth"
app.exe -quit      // client process causes server instance to terminate.

Моя единственная проблема в том, что когда я выполняю указанные выше строки, происходит следующее:

app.exe "first"    // starts app.exe as a pipe server and prints "first"
app.exe "second"   // client process returns a GetLastError code of 233
app.exe "third"    // client process causes server instance to print "third"
app.exe "fourth"   // client process returns a GetLastError code of 233
app.exe "fifth"    // client process causes server instance to print "fifth"
app.exe -quit      // client process returns a GetLastError code of 233

Код моего конвейерного сервера что-то вроде этого (псевдокод):

CreateNamedPipe();
// Code below now runs on a separate thread...
while( !Quit )
{
    if( ConnectNamedPipe() is successful )
    {
        if( PeekNamedPipe() has a message )
        {
            ReadFile();
            ProcessReceivedMessage();
        }
        FileFlushBuffers();
        DisconnectNamedPipe();
    }
}
CloseHandle( the pipe );

Моя версия клиента выглядит так (псевдокод):

if( WaitNamedPipe( FOREVER ) != 0 )
{
    GetParametersAndFormAMessage();
    CreateFile();
    WriteFile(); // Sends message to the pipe server
}
CloseHandle();

Согласно MSDN, если сервер использует DisconnectNamedPipe (), клиент будет отключен принудительно и при следующей попытке клиента , они получат ошибку. Как вы думаете, в этом причина? Если да, то как мне отключить клиента, чтобы не возникла дополнительная ошибка? В противном случае, что-нибудь, что я должен знать, чтобы заставить эту работу ??? Потратил много часов, чтобы понять это.

8
задан MrHuggies 15 December 2010 в 15:42
поделиться