Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: TServerSocket und Benutzeranmeldung

  Alt 27. Nov 2009, 16:05
1.
Also bzgl. des Header kann ich nur sagen: VOLLTREFFER!
Das ware genau das, was mir bei meiner Suche schon über den Weg gelaufen war und ich hatte es nicht aufgeschrieben/gespeichert etc. pp.

Den Quelltext habe ich mir angesehen. Da es ein vollständiges Programm ist, habe ich erhebliche Probleme, das zu verstehen. Ich habe aber Deine Hinweise zum Anlass genommen, selbst loszulegen und zu probieren. Also quasi learning by doing.

2.
Vom Client aus gesehen sieht es beim Connect nun so aus:
Delphi-Quellcode:
Procedure TForm1.SendMsg(Msg_ID: Byte; SData: String; Socket: TCustomWinSocket);
Var
   S            : String;
   Len         : DWord;
Begin
   S:='*****' + SData;
   Len:=Length(SData);
   Move(Msg_ID, S[1], 1);
   Move(Len,    S[2], 4);
   If Socket.SendText(S) < (Len + 5) Then
      ShowMessage(SysErrorMessage(GetLastError));
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Client.Host:='localhost';
   Client.Open;
end;

Procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
Var
   S            : String;
Begin
   S:=Edit1.Text + #00 + Edit2.Text;
   SendMsg(USER_LOGON, S, Socket);
End;

End.
Beim Klick auf den Button wird die Verbindung geöffnet.
-> Daraufhin kommt das Ereignis OnClientConnect. Hier werden Benutzername und Passwort aus den TEdit-Feldern ausgelesen und mittels SendMsg an den Server geschickt. Die '*****' könnten auch was anderes sein. Sie sind nur Platzhalter für die Msg_ID und die Länge.

3.
Am Server sieht es dann so aus:
Delphi-Quellcode:
Procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
Var
   Msg_ID      : Byte;
   Len         : DWord;
   I            : Integer;
   S            : String;
   LogonStr      : String;
Begin
   // Paket entpacken
   S:=Socket.ReceiveText;
   Move(S[1], Msg_ID,   1);
   Move(S[2], Len,      4);
   Delete(S, 1, 5);

   // Auf Logon-Daten prüfen
   If Msg_ID <> USER_LOGON Then Socket.Close            // unbekanntes Protokoll
   Else
   Begin
      LogonStr:=SepString(S, #00) + ':' + S;
      I:=UList.Items.IndexOf(LogonStr);
      If I = -1 Then Socket.Close                     // unbekannter Benutzer
      Else
      Begin
         UList.Items[I]:='@' + UList.Items[I];         // Online-Markierung
         UList.Sorted:=True;                           // Online nach oben         
      End;
   End;
End;
Im Grunde funktioniert das! Ich habe jetzt nur das Problem, wie ich die User verwalten kann. Denn ActiveConnections numeriert ja einfach durch. Damit kann ich es also nicht machen. Wie gesagt habe ich Probleme mit Deinem Beispielcode. Der ist mit Sicherheit sehr ausgeklügelt aufgeteilt (exen, dlls usw.). Aber ich komme damit nicht klar.

Merkst Du Dir die IP? Oder wie wird das gemacht?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat