Page 1 sur 1

[Résolu]Network - Refuser un client ?

Publié : sam. 25/avr./2009 16:41
par kerkael
Salut,

Encore des questions sur le réseau.

Si je démarre un serveur, et que j'attends qu'un client se connecte ... pour faire un jeu à 2 joueurs, par exemple, qu'est-ce que je fais si un 2ème client se pointe ?
Le serveur peut-il refuser une connexion ?
Au premier #PB_NetworkEvent_Connect : je donne un ticket ? Je compte et je filtre ?
Au deuxième #PB_NetworkEvent_Connect : je lui dis quoi ?
Si je CloseNetworkServer(0) : on ferme le bar, tout le monde dehors.

Alors, comment vous faites ?

Publié : sam. 25/avr./2009 16:50
par cederavic
Euh... CloseNetworkConnection(Connexion) ?

Publié : sam. 25/avr./2009 21:23
par scaraber
Bonjour

Personnelement j'utilise un tableau dans lequel je stock les données des client qui se co et que je veu gerer ainsi si je veu ignorer un client je le vire ou je ne l'inscris pas dans le tableau et lors des reception de paquet, ces paquet ne sont pas gerer.

Apres tu peu rajouter un truc tout simple c'est que quand un client se co, si il y a deja deux client sa lui envoie un paquet pour lui dire de ce déconecter.

j'essayerais de retrouver quelque exemple simple des test réseau que j'avais fait.

Si tu as d'autre question hésite pas ;)
++
Scaraber

Re: Network - Refuser un client ?

Publié : sam. 25/avr./2009 21:30
par Le psychopathe
kerkael a écrit :Salut,

Encore des questions sur le réseau.

Si je démarre un serveur, et que j'attends qu'un client se connecte ... pour faire un jeu à 2 joueurs, par exemple, qu'est-ce que je fais si un 2ème client se pointe ?
Le serveur peut-il refuser une connexion ?
Au premier #PB_NetworkEvent_Connect : je donne un ticket ? Je compte et je filtre ?
Au deuxième #PB_NetworkEvent_Connect : je lui dis quoi ?
Si je CloseNetworkServer(0) : on ferme le bar, tout le monde dehors.

Alors, comment vous faites ?
C'est simple, dans ton client tu fais une instruction qui a pour but de stoper la connection.
Le serveur envoie : KICK

Le client reçoit KICK
SI Message = KICK
ALors FINCONNECTION
FINSI

Même chose pour le ban, tu le gêre dans ton client ban 1h, par rapport a l'heure système. Comme ça cela n'envoie pas des requêtes inutiles sur ton serveur.
Si tu as vraiment besoin d'aide, je te code un truc, j'insiste sur le vraiment car je suis en plein devoir de BTS ;)

Publié : dim. 26/avr./2009 22:23
par kerkael
Merci pour les coups de pouce. Et merci pour la proposition d'aide, mais j'en suis encore à dessiner les grandes lignes. Si je bute sur un point précis, je demanderai des précisions.
Le kick, et le ban c'est pas mal. Mais quand on diffuse une telle appli, on informe les utilisateurs quel port ils doivent ouvrir pour utiliser l'appli. Sans être parano, est-ce que cette information n'est pas en soit une fenêtre ouverte aux agresseurs ?
Comment m'assurer que le connecté est bien celui qu'il prétend être ? Je m'assure que dans le code Client se trouve une clef que le serveur reconnait, et réciproquement ?
D'ailleurs, j'imagine que je ne vais pas coder un client ET un serveur, mais une appli qui contient les 2 fonctions, vu que c'est pour un jeu. Ensuite à l'un des joueurs de se proposer comme hébergeur de la partie.
Mais j'ai vu des messages qui parlaient de faire héberger le partie serveur sur un serveur et de diffuser le client, d'où ma question sur les connexions en masse.
Bon, je lis, je cherche ... mais j'ai pas trouvé ici-bas un code qui correspondrait au début de ma démarche, alors je vais faire mes propres tentatives d'abord.
Merci

Publié : lun. 27/avr./2009 0:37
par scaraber
Je te conseil de faire un serveur et un client et que le client puisse lancer le serv (avec par exemple des parametre pour donnée le port etc au serveur)

Publié : lun. 27/avr./2009 9:36
par kerkael
scaraber a écrit :que le client puisse lancer le serv
Si je fais un client ET un serveu ... tu veux dire sous 2 exécutables distincts ? Et depuis le client, si je choisi d'héberger la session ça lance localement l'exécutable du serveur, c'est ça ?
Et en spécifiant les paramètres, ça donne plus de contrôle si les utilisateurs communiquent par ailleurs (chat, phone ...) pour s'indiquer quels ports ouvrir sur le firewall.

Au fait, j'ai dupliqué mon code client et j'ai tenté 2 connexions vers le serveur, et c'est le même clientID qui est apparu ...

Bon, vu que c'est la même machine qui a lancé les 2 clients, je comprends, mais d'où vient cet ID ?

Publié : lun. 27/avr./2009 10:39
par cederavic
Tu as deux clientID identique sur le server ou sur tes deux clients? Si c'est sur les clients c'est normal je pense, en revanche si tu as deux EventClient() identique sur deux connexion differentes au niveau server, il y a un sushi :?

Publié : ven. 01/mai/2009 23:23
par kerkael
Il s'agit bien de 2 clientID identiques, la même machine exécutant 2 codes identiques en même temps pour se connecter au serveur.

Comment est généré le clientID ? par Hostid ? MacAdress ?

Publié : ven. 01/mai/2009 23:33
par scaraber
Que sa vienne de la meme ip ou pas tu un clientid/client tu t'es planter quelques parre pour avoir deux fois le même

Publié : sam. 02/mai/2009 12:40
par kerkael
Ah, tiens, au temps pour moi, j'avais du me tromper en vérifiant la première fois. J'ai bien deux clientID différents. dsl.

Sinon le numéro de port de connexion du client est lui aussi unique par client, j'imagine, mais à quoi correspond-il ? Il n'est pas nécessaire de lui donner d'ouverture firewall, apparemment. Comment l'exploiter ?



;
; ------------------------------------------------------------
;
; PureBasic - Network (Server) example file
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If initnetwork () = 0
   messagerequester ( "Error Server" , "Network impossible à utiliser!" , 0)
   End
EndIf

Port = 6998
*Buffer = allocatememory (1000)

If createnetworkserver (0, Port, #PB_Network_TCP )

   messagerequester ( "Server" , "Server lancé (Port " + str (Port)+ ")." , 0)
 
   Repeat
     
    SEvent = networkserverevent ()
 
     If SEvent
   
      ClientID = eventclient ()
      ClientIP = getclientip (ClientID)
      ClientPort= getclientport (ClientID)
      
 
       Select SEvent
     
         Case #PB_NetworkEvent_Connect
          
           messagerequester ( "Server" , "Client n° : " + str (ClientID)+ ", Port : " + str (ClientPort)+ " vient de se connecter sous IP: " + str (ClientIP), 0)
 
         Case #PB_NetworkEvent_Data
           messagerequester ( "Server" , "Le Client " + str (ClientID)+ " a envoyé un paquet !" , 0)
           receivenetworkdata (ClientID, *Buffer, 1000)
           messagerequester ( "Server" , "Paquet reçu: " + peeks (*Buffer), 0)
          
          Reponse= messagerequester ( "Server" , "Répondre au client ?" , #PB_MessageRequester_YesNo )
           If reponse= #PB_MessageRequester_Yes
             sendnetworkstring (ClientID, "Message bien reçu" )
            Quit = 1
           EndIf
          
         Case #PB_NetworkEvent_File
           messagerequester ( "Server" , "Client " + str (ClientID)+ " a envoyé un fichier !" , 0)
           receivenetworkfile (ClientID, "C:\TEST_Network.ftp3" )
 
         Case #PB_NetworkEvent_Disconnect
           messagerequester ( "Server" , "Client " + str (ClientID)+ " déconnecté..." , 0)
          Quit = 1
   
       EndSelect
     EndIf
   
   Until Quit = 1
 
   messagerequester ( "Server" , "Fermer le serveur." , 0)
 
   closenetworkserver (0)
Else
   messagerequester ( "Error" , "Server impossible à démarrer." , 0)
EndIf

 
End

Publié : sam. 02/mai/2009 14:29
par scaraber
Le port du client > tu t'en ocupe pas le firewall demandera peut etre pour le programme mais pas pour le port. Utilise seulement le clientid du coté de ton serveur pour identifié les client.
Je te conseil de stocker les donnée des client dans un tableau avec une scructure de ce type

Code : Tout sélectionner

Structure Client
id.l ;ClientId
ip.l;Ip du client
; et apres toutes les donnée que ta besoin (pseudo.s,positionX.l PositionY.l) etc
EndStructure
et dés qu'un client se connecte ou déconecte tu redimentionne le tableau etc.