Login über Winsock



  • Hallo

    Ich habe zur Zeit folgendes Problem:
    Ich versuche über einen Winsock-Verbindung einen Passwort-Abfrage zu realisieren.
    Dabei wartet das Programm mit einem Dialogfenster auf die Eingabe von Name und Passwort wie folgt:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    .
    (Variablen)
    .
    switch (message) 
    {
        case WM_CREATE:
    .
    .
         (Winsock Verbindung einrichten)
         (nach connect dann..)
    .
    .
         while(!login)
         {
    	DialogBox(hInst, (LPCTSTR)IDD_LOGIN, hWnd, (DLGPROC)LoginDlgProc);	username="!"+username+"|"+password+"È";
    	send(sock,username,username.GetLength(),0);
         //	MessageBox(NULL,"Nanu",NULL,MB_OK);
         }
    
         break;
    
         case WM_SOCKET_NOTIFY:
    	wEvent=WSAGETSELECTEVENT(lParam);
    	wError=WSAGETSELECTERROR(lParam);
    
    	switch(wEvent) {
    .
    .
    	case FD_READ:
    
    (falls der Passowrt korrekt, wird hier login auf TRUE gesetzt.)
    
    ..
    

    Die Überprüfung des Passwortes ist korrekt, die Variable wir auch auf TRUE gesetzt.
    Jedoch wird die While Schleife immer 2-mal durchlaufen.
    Auch wenn ich mit Sleep eine Pause einbaue ist es das gleiche Ergebnis.
    Wenn ich jedoch einen MessageBox (wie oben) einbaue wird die Schleife nur einmal durchlaufen
    Ich hab keine Ahnung wieso . Wer kann mir da helfen?

    Danke
    Linus



  • hallo,

    WM_CREATE wird solange nicht "beendet" bis die Schleife mit login == TRUE abgebrochen wird. Nur leider würde ich aus der Hüfte geschossen meinen
    ein FD_READ wird nicht ausgeführt sowie bei WM_CREATE noch was kreiselt.
    Um mit Deinem Ansatz weiter zu kommen müßtest Du direkt nach send() ein recv()
    ausführen und auf die Antwort warten, also erst nach erfolgreichen Login mit
    AsyncSocket ( FD_READ|FD_WRITE ) arbeiten.

    mfg
    rb



  • hallo

    Die Nachricht FDREAD wird schon gesendet.
    Das Problem ist nur, wenn ich in der Schleife eine Messagebox
    aufrufe wird die Dialogbox noch ein zweitesmal aufgerufen und
    danach erst abgebrochen . Also die Variable Login wird auf TRUE gesetzt.
    Es sieht also so aus als ob die Schleife schneller durchlaufen wird als
    das Programm auf FDREAD reagieren kann und Login nicht rechtzeitig auf
    True gesetzt wird. Allerdings habe ich es auch mit Sleep() oder einer
    For-Schleife als Verzögerung versucht, aber das funktionierte nicht.

    Warum nicht? Ich weis nicht was da genau passiert .



  • hallo,

    Mit Spy++ kannst Du Dir die Nachrichten für ein Fenster aufzeichnen lassen,
    also für das Fenster mit der WndProc.

    Ich würde aber eh, das Login komplett in der DialogBox abhandeln und bei erfolgreichen Login mit EndDialog diese beenden. Oder wenn Benutzer auf "Abbrechen" klickt.

    EDIT:
    mal angenommen der Server benötigt 30 minuten um zu antworten, dann würde Dein
    Programm 30 minuten lang immer wiedre die DialogBox aufrufen, wenn OK geklickt wird und jedesmal wieder ein Login senden ...

    Du siehts wohl jetzt ein, das es halt von der Laufzeit die benötigt wird zum Server und zurück abhängig ist. Zudem läuft Server und Client auf einem Rechner
    ist die Signallaufzeit vernachlässigbar, aber Du hast das Problem, das immer
    nur ein Programm aktiv ist und CPU-Zeit bekommt ...
    Es ist möglich, Du wartest auf eine Rückmeldung vom Server, die Schleife steht
    wieder bei while( !login ), dabei hat der Server die Anfrage noch nicht mal erhalten !

    mfg
    rb



  • hi

    ich habs jetzt in der Dialog-Routine abgearbeitet.
    Jedoch ist es dort das gleiche Ergebnis.
    Vielleicht liegt das an der asynchronen Socket-Verbindung, wie du sagst.
    ich werde es mal mit einem antwort-Flag probieren.
    dh. solange keine antwort gekommen ist läuft erst einmal eine Schleife.

    😕 😕

    😡
    Funktioniert auch nicht....
    nach dem receive warte ich bis die Antwort-Nachricht das Flag setzt.

    while(!Flag)
    {
    }
    

    Dann läuft die Schleife aber zum zum Nimmerleinstag
    gebe ich aber folgendes ein

    while(!Flag)
    {
         MessageBox(....);
    }
    

    wird alles richtig ausgeführt.

    😕



  • hallo,

    wie wäre es wenn Du das Protokoll mal was änderst.
    Der Server meldet sich zu erst beim Client: "Hier ist Server xyz"

    Da hast Du schon mal ein FD_READ im Client.

    Wenn der Server sich nur meldet, wird die DIalogBox angezeigt. Danach Send() ausgeführt, oder nach Abbruch auch nicht.

    Wenn Send():
    Dann irgendwann wird der Server wieder antworten, hofft man.
    Nun Antwortet er mit "login ok", das wertest Du aus (login=true) und machst nichts, der Benutzer ist eingeloggt.

    Wenn der Server mit "Error login" antwortet, zeigts Du die Dialogbox erneut an.

    Du hast also eigentlich keine Schleife im klassischen Sinn mit while oder for.
    Die Schleife entsteht durch das Zusammenspiel von Server und Client ( Protokoll ) und dessen entsprechende Auswertung/Reaktion.

    Schau Dir mal einfache andere Protokolle an wie POP3.

    mfg
    rb



  • Hi

    Wenn ich das so mache wie Du es vorschlägst funktioniert es.
    Doch wird dann schon das eigentliche Programmfenster sichtbar.
    Das wollte ich eigentlich vermeiden.

    NA , Bevor ich jetzt noch graue Haare bekomme , nehme ich das dann
    als Kompromiß hin

    Vielen Dank für Deinen Hilfe

    Gruss Linus

    PS:
    Ich könte ja auch einen reine Dialoganwendung daraus machen
    Dann brauch ich das Fenster nicht und rufe einfach das Dialogfenster auf



  • hallo,

    dann mache das Loginprozedere in einen eigenen Dialog,
    verwende die WndProc für den Dialog in der Art wie sie jetzt ist und funktioniert.

    Erzeuge den Dialog bei WM_CREATE in der WndProc_Main, diesmal ohne while(!login) drumherum 😉

    bei EndDialog(HWND hDlg,int nResult);

    für nResult: 0 err, 1 login ausgeben und

    <WndProc_Main>
    WM_CRAETE:
    if( DialogBox( ... ) == 0 )
    PostQuitMessage( ... ) // App beenden

    return TRUE;
    break;

    mfg
    rb



  • hallo

    Hat funktioniert,

    Danke für die Hilfe


Log in to reply