Probleme mit Named Pipes



  • Hallo allerseitz...

    Ich hoffe Ihr könnt mir Helfen.

    Erstmal was mein Problem ist:
    Ich habe einen Thread, in dem ich eine Verbindung mit einem IRC Server herstelle.
    Nun will ich, aus jedem anderen belibigen Thread über diese internet verbindung was verschicken (Test-Nachrichten)
    Dafür habe ich eine Named Pipe erstell:

    DWORD WINAPI irc(PARAMS* par) {
        char pbuffer[260] = "";
        DWORD dwRead;
        HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\qbic", PIPE_ACCESS_INBOUND, PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES, 256, 256, 120*1000, NULL);
        ConnectNamedPipe(pipe, NULL);
        while(1) {
            memset(pbuffer, 0, 260);
            ReadFile(pipe, pbuffer, 256, &dwRead, NULL);
            if(strcmp(pbuffer, "")) {
                IRCMessage(pbuffer);
            }
            }
            Sleep(1);
        }
    

    So in der volgenden Funktion sende ich entwas an die Pipe:

    void toirc(char * msg, ...) {
        HANDLE pipe = CreateFile("\\\\.\\pipe\\qbic", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        char buffer[256] = "";
        DWORD dwSent;
    
        va_list args;
        va_start(args, msg);
        vsprintf(buffer,msg, args);
    
        WriteFile(pipe,buffer,sizeof(buffer)+1,&dwSent,NULL);
    
        va_end(args);
    
        CloseHandle(pipe);
    }
    

    Das funzt beim ersten mal auch ganz gut, aber beim 2. mal ausführen, gibt es volgende Errors:
    CreateFile() returned error code: 231
    WriteFile() returned error code: 6
    (Per GetLastError() rausbekommen...)

    Jetzt meine Frage, wie kann ich auch öfter was über diese Pipe schicken?
    Oder gibt es evtl. einen besseren lösungsweg für mein Vorhaben?

    MfG



  • CreateNamedPipe und ReadFile reicht nicht.

    Server:

    CreateNamedPipe
    while (1)
    {
    	ConnectNamedPipe
    	ReadFile
    	DisconnectNamedPipe
    }
    

    Client:

    try:
    CreateFile
    if error==ERROR_PIPE_BUSY
    	WaitNamedPipe(name, time)
    	goto try
    else if error
    	no_server()
    	// queue.Add(message)
    else
    	// queue.SendAll()
    	WriteFile/TransactNamedPipe
    	CloseHandle
    }
    


  • Ok danke, hat mir ein Stück weitergeholfen, aber jetzt hab ich wieder ein Problem.

    Und zwar hab ich hier die Function zum senden, die warten soll, falls die pipe nochnicht existiert.

    void toirc(char * msg, ...) {
        HANDLE pipe;
        WaitNamedPipe("\\\\.\\pipe\\qbic", NMPWAIT_WAIT_FOREVER);
        do {
            pipe = CreateFile("\\\\.\\pipe\\qbic", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        } while (pipe == INVALID_HANDLE_VALUE);
        cout << endl << "CreateFile: " << GetLastError() << endl;
        char buffer[256] = "";
        DWORD dwSent;
    
        va_list args;
        va_start(args, msg);
        vsprintf(buffer,msg, args);
    
        WriteFile(pipe,buffer,sizeof(buffer)+1,&dwSent,NULL);
        cout << endl << "WriteFile: " << GetLastError() << endl;
    
        va_end(args);
    
        CloseHandle(pipe);
    }
    

    Das Problem ist jetzt, sobald ich öfters diese function aufrufen, scheint es bei WriteFile(pipe,buffer,sizeof(buffer)+1,&dwSent,NULL); einfach zu stoppen.

    ich hab vor WriteFile und danach eine ausgabe machen lassen, es kahm nur die davor an, also denke ich es liegt an dem WriteFile ...

    Habe ich was falsch gemacht?

    MfG



  • Sry für Doppelpost, nur edit geht leider nicht...

    Ich hab jetzt herrausgefunden, das das senden bei genau 2 funktionen nicht funzt...
    eine funktion zum plugin starten, die andere zum stoppen...
    ich hab noch eine funktion, die check ob alle plugins laufen wie sie sollen, diese funktion wird jede sekunde in einer while ausgeführ...die funktion liegt in der gleichen klasse, und da funktionierts tadenlos...

    Ich weis ehrlich nicht was ich da jetzt machen soll ?!


Log in to reply