Page 1 sur 1

structure server

Publié : dim. 18/avr./2004 11:35
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

Publié : dim. 18/avr./2004 12:14
par Oliv
Pourquoi avoir fait un tableau et non une LinkerList ?
ça permet une plus grande souplesse non ?

Publié : dim. 18/avr./2004 12:15
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 ;)

Publié : lun. 14/juin/2004 19:48
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 ?

Publié : lun. 14/juin/2004 20:24
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 :)

Publié : mar. 15/juin/2004 9:33
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 
:)

Publié : mar. 15/juin/2004 18:09
par Aranoth
ah ok merci ;)