Ça y est ça marche
Juste au cas où ça puisse servir à quelqu'un :
Serveur :
Code : Tout sélectionner
EnableExplicit
#VERSION = "0.1"
#RECEIVEBUFFERSIZE = 10000
#SENDBUFFERSIZE = 10000
Enumeration 42
#SERVER_verif
#SERVER_valid
#SERVER_refus
#SERVER_welcome
#SERVER_disconnect
#CLIENT_verif
#CLIENT_speak
#CLIENT_list
EndEnumeration
Structure t_client
id.l
ip.l
timer.l
EndStructure
Global NewList t_client.t_client()
Structure client
id.l
login.s
pass.s
ip.l
timer.l
EndStructure
Global NewList client.client()
Global *receive_buffer.l = AllocateMemory(#RECEIVEBUFFERSIZE)
Global *receive_buffer_e.l = AllocateMemory(1.4*#RECEIVEBUFFERSIZE)
Global *send_buffer.l = AllocateMemory(#SENDBUFFERSIZE)
Global *send_buffer_e.l = AllocateMemory(1.4*#SENDBUFFERSIZE)
Declare Main()
Declare Frame(message.s)
Declare CheckDatabaseUpdate(Database.l, Query.s)
Enumeration
#Server
#DataBase
EndEnumeration
Declare Init()
Procedure Init()
If InitNetwork()=0
MessageRequester("Erreur InitNetwork()", "Impossible d'initialiser le reseau.",0)
End
EndIf
If OpenConsole() = 0
MessageRequester("Erreur OpenConsole()", "Impossible d'ouvrir la console.")
End
EndIf
ConsoleTitle ("Serveur MMORPG v"+#VERSION)
UseSQLiteDatabase()
Define i.l
Global str.s
For i = 1 To 80
str = str + Chr(205)
Next
EndProcedure
Declare SendEncodedMessageToClient(ClientID.l, type.l, message.s)
Declare SendEncodedMessageToT_Client(ClientID.l, type.l, message.s)
Declare ReceiveEncodedData(ClientID.l)
Procedure SendEncodedMessageToClient(ClientID.l, type.l, message.s)
PokeL(*send_buffer, type)
If message <> ""
PokeS(*send_buffer+4, message)
EndIf
Base64Encoder(*send_buffer, #SENDBUFFERSIZE, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
ResetList(client())
While NextElement(client())
If client()\id = ClientID
SendNetworkData(client()\id, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
EndIf
Wend
FillMemory(*send_buffer, #SENDBUFFERSIZE)
FillMemory(*send_buffer_e, 1.4*#SENDBUFFERSIZE)
EndProcedure
Procedure SendEncodedMessageToT_Client(ClientID.l, type.l, message.s)
PokeL(*send_buffer, type)
If message <> ""
PokeS(*send_buffer+4, message)
EndIf
Base64Encoder(*send_buffer, #SENDBUFFERSIZE, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
ResetList(t_client())
While NextElement(t_client())
If t_client()\id = ClientID
SendNetworkData(t_client()\id, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
EndIf
Wend
FillMemory(*send_buffer, #SENDBUFFERSIZE)
FillMemory(*send_buffer_e, 1.4*#SENDBUFFERSIZE)
EndProcedure
Procedure ReceiveEncodedData(ClientID.l)
Protected result.l = 0, message.s
ResetList(t_client())
While NextElement(t_client())
If t_client()\id = ClientID
Repeat
result = ReceiveNetworkData(t_client()\id, *receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
Until result = 1.4*#RECEIVEBUFFERSIZE
Base64Decoder(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE, *receive_buffer, #RECEIVEBUFFERSIZE)
Select PeekL(*receive_buffer)
Case #CLIENT_verif
AddElement(client())
client()\id = t_client()\id
message = PeekS(*receive_buffer+4)
client()\login = Left(message, FindString(message, Chr(221), 1)-1)
client()\pass = Right(message, Len(message)-FindString(message, Chr(221), 1))
client()\ip = t_client()\ip
client()\timer = ElapsedMilliseconds() + 600000
PrintN(FormatDate("%hh:%ii | ", Date())+"Login : "+client()\login)
PrintN(FormatDate("%hh:%ii | ", Date())+"Mot de passe : "+client()\pass)
If DatabaseQuery(#DataBase, "SELECT * FROM player WHERE login = '"+client()\login+"' AND pass = '"+MD5Fingerprint(@client()\pass, Len(client()\pass))+"'")
If NextDatabaseRow(#DataBase)
PrintN(FormatDate("%hh:%ii | ", Date())+"Identification valid"+Chr(130)+"e")
;envoyer confirmation
DeleteElement(t_client(), 1)
Else
PrintN(FormatDate("%hh:%ii | ", Date())+"Identification refus"+Chr(130)+"e")
SendEncodedMessageToT_Client(t_client()\id, #SERVER_refus, "")
DeleteElement(client(), 1)
EndIf
FinishDatabaseQuery(#DataBase)
Else
PrintN(FormatDate("%hh:%ii | ", Date())+"Identification refus"+Chr(130)+"e")
SendEncodedMessageToT_Client(t_client()\id, #SERVER_refus, "")
DeleteElement(client(), 1)
EndIf
EndSelect
FillMemory(*receive_buffer, #RECEIVEBUFFERSIZE)
FillMemory(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
ProcedureReturn
EndIf
Wend
ResetList(client())
While NextElement(client())
If client()\id = ClientID
client()\timer = ElapsedMilliseconds() + 600000
Repeat
result = ReceiveNetworkData(client()\id, *receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
Until result = 1.4*#RECEIVEBUFFERSIZE
Base64Decoder(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE, *receive_buffer, #RECEIVEBUFFERSIZE)
; etc...
FillMemory(*receive_buffer, #RECEIVEBUFFERSIZE)
FillMemory(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
Break
EndIf
Wend
EndProcedure
Init()
Main()
End
Procedure Main()
If *receive_buffer = 0 Or *receive_buffer_e = 0 Or *send_buffer = 0 Or *send_buffer_e = 0
MessageRequester("Erreur AllocateMemory()", "Impossible d'allouer la mémoire nécessaire.",0)
End
EndIf
ExamineIPAddresses()
Global Ip.l = NextIPAddress(), Port.l
Frame("Serveur MMORPG v"+#VERSION+" - deeph")
PrintN("")
Repeat
Print("Port : ")
Port = Val(Input())
PrintN("")
Until Port > 0 And Port < 65000
If CreateNetworkServer(#Server, Port)
PrintN(FormatDate("%hh:%ii | ", Date())+"Serveur "+IPString(Ip)+":"+Str(Port)+" lanc"+Chr(130))
If OpenDatabase(#DataBase, "mmorpg.sqlite", "", "")
PrintN(FormatDate("%hh:%ii | ", Date())+"Base de donn"+Chr(130)+"e ouverte")
Else
PrintN(FormatDate("%hh:%ii | ", Date())+"Impossible d'ouvrir la base de donn"+Chr(130)+"e : "+DatabaseError())
End
EndIf
Else
PrintN(FormatDate("%hh:%ii | ", Date())+"Impossible de lancer le serveur")
End
EndIf
Repeat
Select NetworkServerEvent()
Case #PB_NetworkEvent_Connect
AddElement(t_client())
t_client()\id = EventClient()
t_client()\ip = GetClientIP(t_client()\id)
t_client()\timer = ElapsedMilliseconds() + 10000
PrintN(FormatDate("%hh:%ii | ", Date())+"Tentative de connexion au serveur")
SendEncodedMessageToT_Client(t_client()\id, #SERVER_verif, "")
Case #PB_NetworkEvent_Data
ReceiveEncodedData(EventClient())
Case #PB_NetworkEvent_Disconnect
ForEach client()
If client()\id = EventClient()
DeleteElement(client(), 1)
Break
EndIf
Next
EndSelect
ForEach t_client()
If t_client()\timer < ElapsedMilliseconds()
PrintN(FormatDate("%hh:%ii | ", Date())+"Timeout du client temporaire n"+Chr(176)+Str(t_client()\id))
DeleteElement(t_client(), 1)
EndIf
Next
Delay(5)
ForEver
EndProcedure
Procedure Frame(message.s)
PrintN(Chr(201)+Left(str, Len(message)+2)+Chr(187))
PrintN(Chr(186)+" "+message+" "+Chr(186))
PrintN(Chr(200)+Left(str, Len(message)+2)+Chr(188))
EndProcedure
Procedure CheckDatabaseUpdate(Database.l, Query.s)
Define result.l = DatabaseUpdate(Database, Query)
If result = 0
PrintN(DatabaseError())
EndIf
ProcedureReturn result
EndProcedure
Client :
Code : Tout sélectionner
EnableExplicit
#VERSION = "0.1"
#RECEIVEBUFFERSIZE = 10000
#SENDBUFFERSIZE = 10000
Enumeration 42
#SERVER_verif
#SERVER_valid
#SERVER_refus
#SERVER_welcome
#SERVER_disconnect
#CLIENT_verif
#CLIENT_speak
#CLIENT_list
EndEnumeration
Global *receive_buffer.l = AllocateMemory(#RECEIVEBUFFERSIZE)
Global *receive_buffer_e.l = AllocateMemory(1.4*#RECEIVEBUFFERSIZE)
Global *send_buffer.l = AllocateMemory(#SENDBUFFERSIZE)
Global *send_buffer_e.l = AllocateMemory(1.4*#SENDBUFFERSIZE)
Declare Main()
Declare Frame(message.s)
Declare Init()
Procedure Init()
If InitNetwork()=0
MessageRequester("Erreur InitNetwork()", "Impossible d'initialiser le reseau.",0)
End
EndIf
If OpenConsole() = 0
MessageRequester("Erreur OpenConsole()", "Impossible d'ouvrir la console.")
End
EndIf
ConsoleTitle ("Client MMORPG v"+#VERSION)
Define i.l
Global str.s
For i = 1 To 80
str = str + Chr(205)
Next
EndProcedure
Declare SendEncodedMessageToServer(Connexion.l, type.l, message.s)
Declare ReceiveEncodedData(Connexion.l)
Procedure SendEncodedMessageToServer(Connexion.l, type.l, message.s)
PokeL(*send_buffer, type)
If message <> ""
PokeS(*send_buffer+4, message)
EndIf
Base64Encoder(*send_buffer, #SENDBUFFERSIZE, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
SendNetworkData(Connexion, *send_buffer_e, 1.4*#SENDBUFFERSIZE)
FillMemory(*send_buffer, #SENDBUFFERSIZE)
FillMemory(*send_buffer_e, 1.4*#SENDBUFFERSIZE)
EndProcedure
Procedure ReceiveEncodedData(Connexion.l)
Protected result.l, login.s, pass.s
Repeat
result = ReceiveNetworkData(Connexion, *receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
Until result = 1.4*#RECEIVEBUFFERSIZE
Base64Decoder(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE, *receive_buffer, #RECEIVEBUFFERSIZE)
Select PeekL(*receive_buffer)
Case #SERVER_verif
Print("Login : ")
login = Input()
Print("Mot de passe : ")
pass = Input()
SendEncodedMessageToServer(Connexion, #CLIENT_verif, login+Chr(221)+pass)
Case #SERVER_refus
PrintN("Identification refus"+Chr(130)+"e")
Print("Login : ")
login = Input()
Print("Mot de passe : ")
pass = Input()
SendEncodedMessageToServer(Connexion, #CLIENT_verif, login+Chr(221)+pass)
EndSelect
FillMemory(*receive_buffer, #RECEIVEBUFFERSIZE)
FillMemory(*receive_buffer_e, 1.4*#RECEIVEBUFFERSIZE)
EndProcedure
Init()
Main()
End
Procedure Main()
If *receive_buffer = 0 Or *receive_buffer_e = 0 Or *send_buffer = 0 Or *send_buffer_e = 0
MessageRequester("Erreur AllocateMemory()", "Impossible d'allouer la mémoire nécessaire.",0)
End
EndIf
Global Ip.s, Port.l, Connexion
Frame("Client MMORPG v"+#VERSION+" - deeph")
PrintN("")
Repeat
Print("Ip : ")
Ip = Input()
PrintN("")
Print("Port : ")
Port = Val(Input())
PrintN("")
Until Port > 0 And Port < 65000
Connexion = OpenNetworkConnection(Ip, Port)
If Connexion
PrintN(FormatDate("%hh:%ii | ", Date())+"Connexion "+Chr(133)+" "+Ip+":"+Str(Port)+" r"+Chr(130)+"ussis")
Else
PrintN(FormatDate("%hh:%ii | ", Date())+"Impossible de se connecter au serveur")
End
EndIf
PrintN("")
Repeat
Select NetworkClientEvent(Connexion)
Case #PB_NetworkEvent_Data
ReceiveEncodedData(Connexion)
EndSelect
Delay(5)
ForEver
EndProcedure
Procedure Frame(message.s)
PrintN(Chr(201)+Left(str, Len(message)+2)+Chr(187))
PrintN(Chr(186)+" "+message+" "+Chr(186))
PrintN(Chr(200)+Left(str, Len(message)+2)+Chr(188))
EndProcedure