Probleme bei PeekNamedPipe()



  • Hallo mal wieder,

    ich habe leider ein neues Problem...
    Ich möchte mt PeekNamedPipe() testen, ob Daten in der Pipe warten und gegenenfalls diese Daten lesen. Leider stürzt das Programm beim Aufruf von PeekNamedPipe() immer ab.
    Hier mein Code:

    Server:

    void PipeServer::CreatePipe(){
        //Hier wird die Pipe erstellt        
        pipe = CreateNamedPipe(
                "\\\\.\\pipe\\HLAPipe",
                PIPE_ACCESS_DUPLEX,
                PIPE_TYPE_MESSAGE,
                1,
                0,
                0,
                10000,
    	    NULL);
        if (pipe == NULL || pipe == INVALID_HANDLE_VALUE) {
            printf("Failed to create pipe instance.\n");
            //system("Pause");
            return;
        }
        return;
    }
    void PipeServer::sndMessage(wstring wMsg){
        //Hier wird nach dem Start des Clients eine Nachricht gesendet
        BOOL result;
        if(Connected == false){
            result = ConnectNamedPipe(pipe, NULL);
        }
        const wchar_t *data = wMsg.c_str();
        DWORD numBytesWritten = 0;
        result = WriteFile(
            pipe,
            data,
            wcslen(data) * sizeof(wchar_t),
            &numBytesWritten,
            NULL);
        );
        return;
    }
    

    Der Client:

    PipeClient::PipeClient(){
    	//establish connection to Pipe
    	cout << "Connecting to pipe..." << endl;
    	pipe = CreateFile(
    		L"\\\\.\\pipe\\HLAPipe",
    		GENERIC_READ | GENERIC_WRITE,
    		FILE_SHARE_READ | FILE_SHARE_WRITE,
    		NULL,
    		OPEN_EXISTING,
    		FILE_ATTRIBUTE_NORMAL,
    		NULL
    	);
        }
    }
    
    BOOL PipeClient::newMsg(){
    	DWORD available_bytes;
    	int result;
    	result = WaitNamedPipe(L"\\\\.\\pipe\\HLAPipe",5000);
            //Hier stürzt das Programm ab
    	result = PeekNamedPipe(pipe,0,0,0,&available_bytes,0);
    	if(available_bytes > 0){
    		rcvMessage(); // Hier wird die Nachricht aus der Pipe geholt
    		return true;
    	}
    	else return false;
    }
    

    Aus Übersichtsgründen habe ich die Fehlerbehandlung nicht mit gepostet, es werden auch keine Fehler erzeugt. Die Client-"NewMsg()"-Funktion wurde nicht geändert.
    Habe ich irgendwas vergessen/übersehen/...?
    Eigentlich sollte PeekNamedPipe() doch nur auf die Datei zugreifen und sehen, ob was darin liegt...

    Ich hoffe, ihr könnt mir weiterhelfen
    Viele Grüße
    Cherup



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • DEBUGGER?!



  • Was möchtest du mir damit sagen?
    Was der Debugger ausgibt (eine Speicherzugriffsverletzung), ob ich mit dem Debugger versucht habe den Fehler zu finden (ja habe ich, konnte aber nicht mehr herausfinden als das diese Funktion den Absturz verursacht) oder was möchtest du wissen?



  • So,
    ich habe mal etwas weiter rumprobiert.
    Die Pipe wird erfolgreich erstellt und beide Seiten (Server und Client) sind verbunden. Die erste Nachricht wird versucht vom Server zu senden.
    Sobald newMsg() im Client aufgerufen wird, scheint die Pipe nicht mehr zu existieren. WaitNamedPipe() liefert einen timeout und PeekNamedPipe wie gesagt einen Speicherzugriffsfehler...

    Habe ich irgendwo Probleme mit Zugriffsrechten?



  • Vermutlich nicht, die Win32 API meldet über Rückgabewerte Erfolg oder Misserfolg. Da sie ein C-Interface besitzt wirft sie auch keine Exceptions. Da bleiben eigentlich nur noch Speicherfehler oder falsche Parameter im Client Code übrig.



  • ok, danke für die Antwort. Die Parameter der Pipe werden vom Client ja bei createfile() automatsch übernommen...
    Andere Frage, bzw, vielleicht Problemstelle.
    Die Client-Klasse wird von einer anderen Klasse aus aufgerufen und der Pointer auf das entsprechende Objekt an eine Funktion übergeben.

    Der Code dazu:
    [code="cpp"]
    HLAIF(){

    PipeClient *pipeclient = new PipeClient();
    run(pipeclient);
    }

    void run(PipeClient *pipeclient){
    ...
    pipeclient->newMsg();
    ...
    }

    Kann es vielleicht daran liegen, dass der Pipe-Handle bei der Übergabe verloren geht? Eigentlich nicht oder?



  • Soo ich denke ich habe das grundlegende Problem gefunden, die Klassen-Objekte verlieren die Variablen-Werte und Handler. Warum das aber so ist weiß ich noch nicht...

    Dieser Thread kann also zwar nicht als gelöst aber als geschlossen betrachtet werden.



  • ?! Zeig mal mehr Code!



  • Hab den Fehler gerade selbst gefunden.
    Der war extrem blöd... Hatte ein Problem mit doppelten Variablennamen und dementsprechend mit der Gültigkeit der Referenz... 😃
    Jetzt läuft es und das Problem ist daher

    -> gelöst 🙂


Log in to reply