structure server

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

structure server

Message par cederavic »

voila, la base d'un server, chaque client est independant, un thread pour chaque client qui est detruit lorsqu'il se deconnecte (ou le server le deconnecte)

Code : Tout sélectionner

Declare ManageUser(user.l)

InitNetwork()

#MAX_USER = 50

Global Eol.s : Eol = Chr(13) + Chr(10)

Structure user
  CID.l
  StartRequest.b
  ThreadID.l
  Request.l
  RequestLen.l
EndStructure

Dim UserArray.user(#MAX_USER)
Request = AllocateMemory(2000)

OpenConsole()

SID = CreateNetworkServer(25)

If SID
  PrintN("Server lancé")
  Repeat
  
    sEvent.l = NetworkServerEvent()
    
    If sEvent
      CID.l = NetworkClientID()
      Select sEvent
    
        Case 1
          For tuser = 0 To #MAX_USER - 1
            If UserArray(tuser)\CID = 0
              Break
            EndIf
          Next
          UserArray(tuser)\CID = CID
          UserArray(tuser)\ThreadID = CreateThread(@ManageUser(), tuser)
          PrintN("Nouveau client : " + Str(CID))
          
        Case 2
          For tuser = 0 To #MAX_USER
            If UserArray(tuser)\CID = CID And UserArray(tuser)\StartRequest = #false
                UserArray(tuser)\StartRequest = #true
              Break            
            EndIf
          Next
          
        Case 4
          For tuser = 0 To #MAX_USER
            If UserArray(tuser)\CID = CID
              UserArray(tuser)\CID = 0
              Break            
            EndIf
          Next
    
      EndSelect
    EndIf
    
  ForEver
EndIf

Procedure ManageUser(user.l)
  Delay(200)
  PrintN("Thread " + Str(UserArray(user)\ThreadID) + " créé pour le client " + Str(UserArray(user)\CID))
  UserArray(user)\Request = AllocateMemory(2000)
  Repeat
    If UserArray(user)\CID = 0
      PrintN("Thread " + Str(UserArray(user)\ThreadID) + "  detruit")
      KillThread(UserArray(user)\ThreadID)
    EndIf
    If UserArray(user)\StartRequest = #true
      UserArray(user)\RequestLen = ReceiveNetworkData(UserArray(user)\CID, UserArray(user)\Request, 2000)
      While UserArray(user)\RequestLen = 2000
        UserArray(user)\RequestLen = ReceiveNetworkData(UserArray(user)\CID, UserArray(user)\Request, 2000)
      Wend
      
      PrintN("User " + Str(UserArray(user)\CID) + " : " + PeekS(UserArray(user)\Request))
      
      UserArray(user)\StartRequest = #false
      FreeMemory(UserArray(user)\Request)
      UserArray(user)\Request = AllocateMemory(2000)
    EndIf
  ForEver

EndProcedure
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Pourquoi avoir fait un tableau et non une LinkerList ?
ça permet une plus grande souplesse non ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

ben avec une linkeDlist, il faudra changer l'element courant dans les thread pour recuperer les info, et si tout les thread change l'element courant, je pense que sa va merdouiller ;)
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Message par Ombres »

euh il me semble que KillThread(UserArray(user)\ThreadID) est le genre de fonction qu'on utilise quand on y est vraiment obligé ...
Alors qu'ici il suffit de mettre un procedurereturn a la place pour que le thread se termine ... non ?
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

par contre je comprend pas tout le code...

Code : Tout sélectionner

        Case 2 
          For tuser = 0 To #MAX_USER 
            If UserArray(tuser)\CID = CID And UserArray(tuser)\StartRequest = #false 
                UserArray(tuser)\StartRequest = #true 
              Break            
            EndIf 
          Next 
ca par exemple, le coup de True and False...

peut tu me décrire un peu comment marche ton code?

merci :)
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Message par Ombres »

Code : Tout sélectionner

        Case 2 ;Quand un client doit recevoir des données
          For tuser = 0 To #MAX_USER   ;On cherche le client dans le tableau
            If UserArray(tuser)\CID = CID And UserArray(tuser)\StartRequest = #false
                ;On met son flag a #TRUE
                ;Le thread regarde ce flag pour savoir si il doit recevoir quelquechose
                ;Quand il a tout recu le thread remet ce flag sur #FALSE
                UserArray(tuser)\StartRequest = #true 
              Break            
            EndIf 
          Next 
:)
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

ah ok merci ;)
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Répondre