Page 1 sur 1

Tentative de serveur web

Publié : lun. 06/mars/2006 17:35
par Progi1984
Voilà débutant dans l'utilisation des buffers et autes pointeurs, je ne comprends pas pourquoi ca bugge quand on tente d'accéder au serveur web.

Pour faire bugger :
-lancer le programme
-lancer un navigateur
-accéder à 127.0.0.1

Code : Tout sélectionner

;-Déclaration des globales
Global port.l
Global nameserver.s

;-Déclaration des fonctions
Declare NoGoth_Receive(*RBuffer,ClientID)
Declare NoGoth_RThread(message)
;-Initialisation des globales
port=80
nameserver.s="Server"

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

*Buffer = AllocateMemory(10000)
If CreateNetworkServer(0,port)
  Repeat
    Repeat
      WEvent = WindowEvent()
      If WEvent = #PB_Event_CloseWindow 
        Quit = 1
      EndIf
    Until WEvent = 0
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID.l = EventClient()
      ;Debug sevent
      Select SEvent
        Case #PB_NetworkEvent_Connect  ; When a new client has been connected...
        Case #PB_NetworkEvent_Data  ; When a client has closed the connection...
          ReceiveNetworkData(ClientID.l, *Buffer, 2000)
          ;Debug PeekS(*Buffer)
          NoGoth_Receive(*Buffer,ClientID)          
        Case #PB_NetworkEvent_Disconnect
        Case #PB_NetworkEvent_File
        Default
      EndSelect
    Else
     ; Delay(20)  ; Don't stole the whole CPU !
    EndIf
  Until Quit = 1 
  CloseNetworkServer(0)
Else
  MessageRequester(nameserver, "Erreur : impossible de créer le serveur (port en utilisation ?).", 0)
EndIf

Procedure NoGoth_Receive(*RBuffer,ClientID)
  PokeS(*Rbuffer,PeekS(*Rbuffer)+Chr(3)+Str(clientid))
  CreateThread(@NoGoth_RThread(),*RBuffer)
EndProcedure

Procedure NoGoth_RThread(*message)
  message.s= PeekS(*message)
  pos=FindString(message,Chr(3),1)
  clientID=Val(Mid(message,pos+1, Len(message)-pos-1))
  type.s=Left(message,3)
  If type="GET"
    ;Debug "get"
  FreeMemory(*Buffer)
  header.s = "HTTP/1.1 200 OK"+Chr(13)+Chr(10)
  header = header+ "Date: Wed, 07 Aug 1996 11:15:43 GMT"+Chr(13)+Chr(10)
  header = header+ "Server: Atomic Web Server 0.2b"+Chr(13)+Chr(10)
  header = header+ "Content-Length: "+Str(141)+Chr(13)+Chr(10)
  header = header+ "Content-Type: text/html"+Chr(13)+Chr(10)
  header = header+ Chr(13)+Chr(10)
  header = header+ "texte"
  
  *Buffer=AllocateMemory(Len(header)+1)
  PokeS(*Buffer,header)
  Debug PeekS(*Buffer)
  
  ;*FileBuffer=AllocateMemory(Len("texte")+1)
  ;PokeS(*FileBuffer, "texte")
  ;Debug PeekS(*FileBuffer)
  
  SendNetworkData(ClientID, *Buffer,MemorySize(*Buffer));*FileBuffer-*Buffer+6)
  ElseIf type="POS"
    Debug "pos"
  ElseIf type="HEA"
    Debug "hea"
  EndIf
EndProcedure
Merci !

Publié : mar. 07/mars/2006 21:35
par Progi1984
J'ai réussi à résoudre le problème, en partie grace à Trond

Désolé, mais le code est vrai dégueu mais il marche :)

Code : Tout sélectionner

;-Déclaration des globales
Global port.l
Global nameserver.s

;-Déclaration des fonctions
Declare NoGoth_Receive(*RBuffer,ClientID)
Declare NoGoth_RThread(message)
;-Initialisation des globales
port=80
nameserver.s="Server"

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

*Buffer = AllocateMemory(10000)
If CreateNetworkServer(0,port)
  Repeat
    Repeat
      WEvent = WindowEvent()
      If WEvent = #PB_Event_CloseWindow
        Quit = 1
      EndIf
    Until WEvent = 0
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID.l = EventClient()
      ;Debug sevent
      Select SEvent
        Case #PB_NetworkEvent_Connect  ; When a new client has been connected...
        Case #PB_NetworkEvent_Data  ; When a client has closed the connection...
          ReceiveNetworkData(ClientID.l, *Buffer, 2000)
          NoGoth_Receive(*Buffer,ClientID)         
        Case #PB_NetworkEvent_Disconnect
        Case #PB_NetworkEvent_File
        Default
      EndSelect
    Else
      Delay(1)  ; Don't comment out this, your app will use 100% CPU if you do!!!!!!!
    EndIf
  Until Quit = 1
  CloseNetworkServer(0)
Else
  MessageRequester(nameserver, "Erreur : impossible de créer le serveur (port en utilisation ?).", 0)
EndIf

Procedure NoGoth_Receive(*message,clientid)
  message.s= PeekS(*message)
  ;pos=FindString(message,Chr(3),1)
  ;clientID=Val(Mid(message,pos+1, Len(message)-pos-1))
  type.s=Left(message,3)
  If type="GET"
    Debug "get"
  FreeMemory(*Buffer)
  headerd.s = "HTTP/1.1 200 OK"+Chr(13)+Chr(10)
  headerd = headerd+ "Date: Tue, 07 Mar 2006 20:00:00 GMT"+Chr(13)+Chr(10)
  headerd = headerd+ "Server: My Web Server 0.2b"+Chr(13)+Chr(10)
  headerd = headerd+ "Content-Length: "
  
  headerf.s = Chr(13)+Chr(10)+ "Content-Type: text/html"+Chr(13)+Chr(10)
  headerf = headerf+ Chr(13)+Chr(10)
  content.s = "texte"
  
  clength= Len(content)
  header.s=headerd+Str(clength)+headerf+content
  
  *Buffer=AllocateMemory(Len(header)+1)
  Debug PeekS(*Buffer)
  PokeS(*Buffer,header) ; I think you need and @ here -----------------------
  Debug PeekS(*Buffer)
 
  ;*FileBuffer=AllocateMemory(Len("texte")+1)
  ;PokeS(*FileBuffer, "texte")
  ;Debug PeekS(*FileBuffer)
 
  SendNetworkData(ClientID, *Buffer,Len(PeekS(*Buffer)));*FileBuffer-*Buffer+6)
  ElseIf type="POS"
    Debug "pos"
  ElseIf type="HEA"
    Debug "hea"
  EndIf
EndProcedure

Publié : mar. 07/mars/2006 22:24
par nico
C'est sympa, faudra que j'étudie ça de plus près.

Publié : mer. 08/mars/2006 9:00
par Progi1984
C'est clair ; il suffit juste de comprendre le truc ; ensuite ca passe tout seul :)