[RESOLU] Networkdata

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

[RESOLU] Networkdata

Message par Anonyme 2 »

Yo,
Dans le but de creer un reseau de t'chat necessitant authentification:
J'ai fait quelques tests avec les codes du manuel purebasic concernant la reception de données (via ReceiveNetworkData()).
Puis je me suis rendu compte que l'on ne pouvait pas distinguer les données recues les unes des autres, ce qui fait que l'on ne peut faire un seul et même serveur dans le but de lui accorder differents fonctionnement (t'chat, authentification)
On est alors obligé ne creer plusieurs serveurs ou chacun d'entre eux ont un seul fonctionnement.
Je m'explique avec un exemple:
Est-ce possible de creer un seul serveur via ceux-la? :

Serveur de t'chat (pris dans les exemples de PureBasic):

Code : Tout sélectionner

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

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
  
        Case #PB_NetworkEvent_File
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

  
End   


Serveur web (pris dans les sources avancées de PureBasic):

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;       Atomic Web Server in PureBasic by AlphaSND
;
;           (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; 25/03/2001
;   Added path relative feature. It can be started everywhere
;   Added the window to kill it easely
;
; 19/03/2001
;   Added some new features (clients closed automatically)
;
; 17/03/2001
;   First version.
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 80
BaseDirectory$ = "www/"
DefaultPage$   = "Index.html"
AtomicTitle$   = "Atomic Web Server v1.0"

Global EOL$

EOL$ = Chr(13)+Chr(10)

*Buffer = AllocateMemory(10000)

If CreateNetworkServer(0, Port)

  OpenWindow(0, 100, 200, 230, 0, "Atomic Web Server (Port "+Str(Port)+")")
  
  Repeat
    
    Repeat
      WEvent = WindowEvent()

      If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until WEvent = 0
    
    SEvent = NetworkServerEvent()
  
    If SEvent
      ClientID.l = EventClient()
  
      Select SEvent
      
        Case 1  ; When a new client has been connected...
          
        Case 4  ; When a client has closed the connection...
  
        Default
          RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000)
          Gosub ProcessRequest
          
      EndSelect

    Else
      Delay(20)  ; Don't stole the whole CPU !
    EndIf
    
  Until Quit = 1 
    
  CloseNetworkServer(0)
Else
  MessageRequester(AtomicTitle$, "Error: can't create the server (port in use ?).", 0)
EndIf
  
End 



Procedure.l BuildRequestHeader(*Buffer, DataLength.l, ContentType$)

  Length = PokeS(*Buffer, "HTTP/1.1 200 OK"+EOL$)                     : *Buffer+Length
  Length = PokeS(*Buffer, "Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$) : *Buffer+Length
  Length = PokeS(*Buffer, "Server: Atomic Web Server 0.2b"+EOL$)      : *Buffer+Length
  Length = PokeS(*Buffer, "Content-Length: "+Str(DataLength)+EOL$)    : *Buffer+Length
  Length = PokeS(*Buffer, "Content-Type: "+ContentType$+EOL$)         : *Buffer+Length
  Length = PokeS(*Buffer, EOL$)                                       : *Buffer+Length

  ; Length = PokeS(*Buffer, "Last-modified: Thu, 27 Jun 1996 16:40:50 GMT"+Chr(13)+Chr(10)  , *Buffer) : *Buffer+Length
  ; Length = PokeS(*Buffer, "Accept-Ranges: bytes"+EOL$                 , *Buffer) : *Buffer+Length
  ; Length = PokeS(*Buffer, "Connection: close"+EOL$) : *Buffer+Length

  ProcedureReturn *Buffer
EndProcedure


ProcessRequest:

  a$ = PeekS(*Buffer)
  
  If Left(a$, 3) = "GET"

    MaxPosition = FindString(a$, Chr(13), 5)
    Position = FindString(a$, " ", 5)
    If Position < MaxPosition
      RequestedFile$ = Mid(a$, 6, Position-5)      ; Automatically remove the leading '/'
      RequestedFile$ = RTrim(RequestedFile$)
    Else
      RequestedFile$ = Mid(a$, 6, MaxPosition-5)   ; When a command like 'GET /' is sent..
    EndIf

      ; The following routine transforme all '/' in '\' (Windows format)
      ;
      Structure tmp
        a.b
      EndStructure

      If RequestedFile$ = ""
        RequestedFile$ = DefaultPage$
      Else
        *t.tmp = @RequestedFile$
        While *t\a <> 0
          If *t\a = '/' : *t\a = '\' : EndIf
          *t+1
        Wend
      EndIf

      ; Test if the file exists, and if not display the error message
      ;   

      If ReadFile(0, BaseDirectory$+RequestedFile$)
      
        FileLength = Lof(0)

        Select Right(RequestedFile$,4)
          Case ".gif"
            ContentType$ = "image/gif"

          Case ".jpg"
            ContentType$ = "image/jpeg"

          Case ".txt"
            ContentType$ = "text/plain"

          Case ".zip"
            ContentType$ = "application/zip"

          Default
            ContentType$ = "text/html"

        EndSelect
        
        *FileBuffer   = AllocateMemory(FileLength+200)
        *BufferOffset = BuildRequestHeader(*FileBuffer, FileLength, ContentType$)

        ReadData(0, *BufferOffset, FileLength)

        CloseFile(0)
 
        SendNetworkData(ClientID, *FileBuffer, *BufferOffset-*FileBuffer+FileLength)
        FreeMemory(*FileBuffer)
      Else
        If ReadFile(0, BaseDirectory$+"AtomicWebServer_Error.html")
          FileLength = Lof(0)
          ContentType$ = "text/html"

          *FileBuffer   = AllocateMemory(FileLength+200)
          *BufferOffset = BuildRequestHeader(*FileBuffer, FileLength, ContentType$)

          ReadData(0, *BufferOffset, FileLength)
          CloseFile(0)
   
          SendNetworkData(ClientID, *FileBuffer, *BufferOffset-*FileBuffer+FileLength)
          FreeMemory(*FileBuffer)
        EndIf
      EndIf
  EndIf

Return
Dernière modification par Anonyme 2 le ven. 02/sept./2011 21:04, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Networkdata; 2 serveurs en 1

Message par G-Rom »

je me suis rendu compte que l'on ne pouvait pas distinguer les données recues les unes des autres, ce qui fait que l'on ne peut faire un seul et même serveur dans le but de lui accorder differents fonctionnement
C'est clair que tu connais pas tripette en réseau, posté des exemples PB ne sert à rien.
si tu veut distinguer des messages les uns des autres , tu n'a qu'a collé un byte à chaque entête de paquets :

Code : Tout sélectionner

#CLIENT_REQUEST_AUTH = $01
#CLIENT_SEND_MESSAGE = $02
#SERVER_BAD_AUTH = $03
#SERVER_AUTH_OK = $04

Pseudo$ = "BOB"
*Paquet = allocatememory( 1 + Taille du pseudo )
PokeA(*Paquet, #CLIENT_REQUEST_AUTH)
PokeS(*Paquet+1,@Pseudo)
de l'autre coté ( le serveur ) va recevoir : "0x01,BOB"
0x01 est une demande d'authentification , BOB le pseudo , qui peut être suivi du password , etc...
ta juste à rajouté un flag à chaque début de message pour savoir quel type de message il s'agit.

@+
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Networkdata; 2 serveurs en 1

Message par Backup »

............
Dernière modification par Backup le sam. 01/oct./2011 9:16, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Networkdata; 2 serveurs en 1

Message par G-Rom »

Dobro a écrit :et encore...t'es gentils de t’arrêter au réseau ;)
Oui , mais aujourd’hui je suis en mode "pied-tendre" :mrgreen: , j'avais pas envie de lui dire qu'il confirme encore une fois que c'est une tanche , mais bon , on débute tous , que ce soit en communication ou en programmation , la prochaine fois il ne viendra pas en disant que c'est un kador, espérons que sa plasticité cérébrale lui permette de retenir la leçon , si il reste cool , je suis même près à l'aider à comprendre ce qu'il ne comprend pas. :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Networkdata; 2 serveurs en 1

Message par Backup »

G-Rom a écrit : on débute tous , que ce soit en communication ou en programmation
oui c'est vrais :)
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

Re: Networkdata; 2 serveurs en 1

Message par Anonyme 2 »

Merci de vos réponses :D

P.S:
il ne viendra pas en disant que c'est un kador
J'ai jamais dis ca :roll:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [RESOLU] Networkdata

Message par G-Rom »

Dzoumaka a écrit :Yo!
Amen, je laisse peut-être tomber cette idée de logiciel :|
Bienvenu, en tant que nouveau membre.
Merci merci!! :)
Dzoumaka peux tu nous dire ton niveau en programation?
Sur quelle échelle je dis mon niveau? :roll:
Dzoumaka a écrit : Vu mon niveau ca ne sera pas trop difficile d'en faire un (mais je prendrais plutot exemple sur le moteur Ogre)
et je n'épluche pas tout tes posts.

@+
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

Re: [RESOLU] Networkdata

Message par Anonyme 2 »

8O
:lol:
:wink:
:mrgreen:
Répondre