Bonjour
Dans le cadre d'un mini-projet, je dois créer un serveur tcp avec delphi. J'ai choisi Indy pour sa facilité, mais je bloque sur un problème: je dois empêcher deux clients ayant le même Identificateur de se connecter en même temps.
Le client envoieau serveur son identificateur aussitôt connecté.
Je précise bien qu'un même id ne peut pas se connecter 2 fois simultanément au serveur: la distinction se fait sur l'identificateur pas sur l'IP.
Ce que j'ai essayé de faire, c'est créer un nouveau type record (TClient: id, dateconnexion.., puis un pointeur vers ce type : PClient) que je transtype en TObject et que je stocke ensuite dans le champ data de TidPeerThread.
le code ressemble à ceci:
Ensuite après chaque nouvelle connexion, je dois vérifier si le nouveau client est déjà connecté. J'en suis pas encore là: je bloque rien qu'en essayant d'afficher dans un TMemo les données des Threads Actifs du serveur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 procedure serveurConnect(AThread: TIdPeerThread); var NewClient: PClient; begin AddLogLine('Nouveau Client à ' + DateTimeToStr(Now) ); GetMem(NewClient, SizeOf(TClient)); NewClient.PeerIP := AThread.Connection.Socket.Binding.PeerIP; NewClient.dtConnected := Now; NewClient.LastAction := NewClient.dtConnected; NewClient.Thread := AThread; AThread.Data := TObject(NewClient); end;
Ci-dessous mon Code:
Où-est-ce que je me trompe? Que dois-je changer?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 var fTL: TList;//TThreadList; fClient: PClient; fTLCount, i: integer; //nombre de threads actifs fIpClient: TIdPeerThread; begin try begin try fTL := TList.Create; fTL := thManager.ActiveThreads.LockList; //thManager: ThreadManager du TidTCPServer fTLCount := fTL.Count; mmTh.Lines.Add('Nombre de Clients Connectés : ' + IntToStr(fTLCount)); i := 0; while i < fTLCount do begin fClient := PClient(TIdPeerThread(fTL.Items[i]).Data); Memo.Lines.Add(DateTimeToStr(fClient.dtConnected)); inc(i); end; finally thManager.ActiveThreads.UnlockList; end; end except on e:exception do begin thManager.ActiveThreads.UnlockList; Memo.Lines.Add('Erreur : ' + e.Message); end
Partager