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