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 einwhile(!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ß hinVielen 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 beendenreturn TRUE;
break;mfg
rb
-
hallo
Hat funktioniert,
Danke für die Hilfe