[résolu] ReceiveNetworkData() d'un client non purebasic et PeekS()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[résolu] ReceiveNetworkData() d'un client non purebasic et PeekS()

Message par blendman »

Salut

J'essaie de faire dialoguer un serveur en purebasic avec un client qui n'est pas purebasic (dans mon cas le client est en AGK).
C'est un serveur pour du jeu (et donc, le "client" est l'application qui sert au joueur pour jouer (application réalisée avec AGK (pour android)).

voici le code de mon serveur (adapté de l'exemple purebasic :

Code : Tout sélectionner

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

Port = 6832
memoiretampon = 2048
*Buffer = AllocateMemory(memoiretampon)

winw = 800
winh= 600
If OpenWindow(0,0,0,winw,winh,"server",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget)
  EditorGadget(0,10,10,winw-20,winh-20) 

  ; If CreateNetworkServer(0, Port,#PB_Network_UDP|#PB_Network_IPv4)
  If CreateNetworkServer(0, Port)
    
     txt$+"Server : Server created (Port "+Str(Port)+")."+Chr(13)
     SetGadgetText(0, txt$)
     
    Repeat
      event = WaitWindowEvent(1)  
      SEvent = NetworkServerEvent()
      
      If SEvent
        
        ClientID = EventClient()
        
        Select SEvent
            
          Case #PB_NetworkEvent_Connect
            txt$+"Server : A new client has connected !"+Chr(13)
            SetGadgetText(0, txt$)
            msg = SendNetworkString(ClientID, "salut") ; mon client ne reçoit rien.
            
          Case #PB_NetworkEvent_Data
            result = ReceiveNetworkData(ClientID, *Buffer, memoiretampon)
            Debug Str(result)+" / "+Str(memoiretampon)
            ; SendNetworkData(ClientID
            txt$+"Server : Client "+Str(ClientID)+" has send a packet !"+Chr(13)
            txt$+"message (utf8) : "+PeekS(*Buffer, result, #PB_UTF8)+Chr(13)
            netresult.s = PeekS(*Buffer, result, #PB_Ascii)
            txt$+"message  : "+netresult +Chr(13)
            txt$+"message (#PB_Unicode) : "+PeekS(*Buffer, result, #PB_Unicode)+Chr(13)
            txt$+"message (#PB_Ascii ) : "+PeekS(*Buffer, result, #PB_Ascii)+Chr(13)
            SetGadgetText(0, txt$)
            
          Case #PB_NetworkEvent_Disconnect
            txt$ + "Server : Client "+Str(ClientID)+" has closed the connection..."+Chr(13)
            SetGadgetText(0, txt$)
        EndSelect
      EndIf
      
      If event=#PB_Event_CloseWindow
        quit = 1
      ElseIf event = #PB_Event_SizeWindow
        ResizeGadget(0,#PB_Ignore, #PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20)
      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   
EndIf
Ensuite, j'ai donc un client (en agk), qui envoie des messages sur le serveur via l'ip (local), le port. J'utilise les sockets en mode TCP:IP avec agk pour tester si ça fonctionne (comme pour le serveur en purebasic).
Et je reçois bien les infos :
- un client s'est connecté
- un client a envoyé un packet
- le client 324839483993 s'est déconnecté.

Donc, ça fonctionne presque, car lorsque j'essaie de lire le message avec PeekS(), ça ne marche pas, je n'obtiens pas le message que j'ai envoyé mais juste 1 caractère genre "|" ou un carré.
Je n'arrive pas à comprendre ce que je dois mettre pour que ça marche.

Si vous avez une idée du problème, ça m'aiderait grandement.

ps : j'ai testé avec les sockets avec AGK ou avec l'exemple de la doc :
https://www.appgamekit.com/documentatio ... etwork.htm
Les sockets :
https://www.appgamekit.com/documentatio ... player.htm

Enfin, ça semble pouvoir fonctionner, mais pour le moment, je n'y arrive pas tout à fait ^^.
Dans les 2 cas, j'ai bien les messages de connection, reception d'un message client et deconnexion. Mais je n'arrive pas à avoir le contenu du message client recu.
Dernière modification par blendman le dim. 31/oct./2021 13:23, modifié 2 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ReceiveNetworkData() d'un client non purebasic et PeekS()

Message par Ollivier »

T'as regardé les options pour PeekS ? Ta description du problème semble montrer que tu as émis en unicode et reçu en ASCII.
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: ReceiveNetworkData() d'un client non purebasic et PeekS()

Message par venom »

Ollivier a écrit : sam. 30/oct./2021 16:43 T'as regardé les options pour PeekS ? Ta description du problème semble montrer que tu as émis en unicode et reçu en ASCII.
C'est ce que j'avais suggéré sur le discord.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ReceiveNetworkData() d'un client non purebasic et PeekS()

Message par blendman »

Coucou

Bon, Naheulf m'a aidé en me faisant résoudre une énigme ^^, qui m'a permis de comprendre comment envoyer et recevoir des messages entre un serveur purebasic et un client (ici, en AGK, mais la technique est certainement adaptable pour n'importe quel langage).

Voici le code fonctionnel pour l'envoi et la réception de données (dans le serveur purebasic) :

Code : Tout sélectionner

Case #PB_NetworkEvent_Connect
            ; un client (agk) se connecte, on va lui envoyé un message pour vérifier
            txt$ = "Bienvenue !"
            ; on va stocker la taille pour le texte (en octet)
            n = StringByteLength(txt$,#PB_UTF8) 
            ; on écrit cette taille dans les 4 premiers bytes, car c'est ce que AGK veut (voir la doc agk (socket) pour comprendre).
            PokeL(*buffer, n)
            ; ensuite, on écrit notre texte dans la mémoire (attention à bien ajouter ces 4 bytes à la taille)
            ; AGK ne veut pas charactère #null à la fin, et il veut tout en utf8 (à régler dans le fichier client)
            PokeS(*buffer + 4, txt$, n+4, #PB_UTF8|#PB_String_NoZero)
            ; on envoie le message
            Resultat = SendNetworkData(ClientID, *buffer, n+4)
           
            
          Case #PB_NetworkEvent_Data
            ; on reçoit des données d'un client
            Taillebuffer = ReceiveNetworkData(ClientID, *Buffer, 2048)
            ; On vérifie la taille des données reçues
            Taille = PeekL(*Buffer)
            If Taille > 0 And Taille < (#TAILLE_TAMPON - 4)
              Message$ = PeekS(*Buffer + 4, Taille, #PB_UTF8 | #PB_ByteLength)
            Else
              ; Erreur ou cas spécial à traiter
            EndIf
C'est valable avec un client AGK, qui veut dans chaque message reçu (avec la technique des socket) 4 bytes pour lui dire la longueur du message (string)). Mais ça doit être adaptable avec n'importe quel langage (java, c++ ou autre).
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: [résolu] ReceiveNetworkData() d'un client non purebasic et PeekS()

Message par venom »

Salut,

Merci du partage blendman, et merci a Naheulf :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre