Pipe Nommé Windows question: le code d'Erreur 233 suppléants

J'ai besoin d'aide sur mon application que je fais. C'est un programme simple qui répond à des paramètres de ligne de commande. Si l'application est invoquée pour la première fois, il démarre comme un serveur de canal (blocage, non-chevauchement) sur un autre thread consacré, tandis que le thread principal ne fait autre chose. Maintenant, l'utilisateur peut toujours invoquer l'application en utilisant le même exécutable de l'application et des paramètres de ligne de commande, mais puisque ce n'est pas la première instance de l'application, il transmet les paramètres de ligne de commande à la première instance à l'aide de la pipe, puis tue lui-même. Donc, c'est comme un singleton processus dans les modèles-lingo.

Idéalement, il devrait ressembler à ceci:

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.

Maintenant, mon seul problème est que quand je fais les lignes ci-dessus ce qui se passe:

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

Ma pipe code serveur va quelque chose comme ceci (pseudo-code):

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 );

Ma version du client va comme ceci (pseudo-code):

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

Selon MSDN, si le serveur utilise DisconnectNamedPipe(), le client est obligé déconnecté et sur la prochaine tentative du client, ils recevront un message d'erreur. Pensez vous que c'est la raison? Si oui, comment dois-je déconnecter un client, sans que l'erreur supplémentaire qui se passe? Sinon, quelque chose que je dois savoir pour faire ce travail??? Passé beaucoup d'heures pour trouver ce out.

OriginalL'auteur MrHuggies | 2010-12-15