Question existentielle

  • Initiateur de la discussion Membre supprimé 98332
  • Date de début
  • Initiateur de la discussion
M

Membre supprimé 98332

Anonyme
Salutations,

Juste une petite question concernant l'optimisation(?), et le meilleurs moyen de transmettre de gros volumes de données de façon optimisée entre serveur / client :
  • Imaginons que je récupère des informations qu'un client a entré, et quelles puissent être très volumineuse, quel est le meilleurs moyen de les récupérer avec le serveur, sachant quelles vont directement être écrites dans un fichier par la suite ?
J'ai pensé à :
  • Un vieux et bon net.ReadString()
  • Un système un peu plus "compliqué", qui consisterai à ce que ce soit le client qui écrive dans le fichier, et le serveur qui télécharge ensuite ce fichier (pas encore cherché pour voir si c'est faisable), mais pour le coup je pense que ça reviendrai au même niveau utilisation de la bande passante
D'ailleurs, comment sont codés les caractères sur GMod ? (je n'ai trouvé aucune ressource qui parle de ça)

Bref, comment faites-vous dans ces cas là ?

Merci,
Gabyfle
 
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
EpicGaby à dit:
Salutations,

Juste une petite question concernant l'optimisation(?), et le meilleurs moyen de transmettre de gros volumes de données de façon optimisée entre serveur / client :
  • Imaginons que je récupère des informations qu'un client a entré, et quelles puissent être très volumineuse, quel est le meilleurs moyen de les récupérer avec le serveur, sachant quelles vont directement être écrites dans un fichier par la suite ?
J'ai pensé à :
  • Un vieux et bon net.ReadString()
  • Un système un peu plus "compliqué", qui consisterai à ce que ce soit le client qui écrive dans le fichier, et le serveur qui télécharge ensuite ce fichier (pas encore cherché pour voir si c'est faisable), mais pour le coup je pense que ça reviendrai au même niveau utilisation de la bande passante
D'ailleurs, comment sont codés les caractères sur GMod ? (je n'ai trouvé aucune ressource qui parle de ça)

Bref, comment faites-vous dans ces cas là ?

Merci,
Gabyfle
cela dépend ce que tu appelles volumineux.
 
Valfunde

Valfunde

Helpeur Divin
Messages
3 800
Score réaction
1 235
Points
450
WriteString supporte jusqu'à 64k caractères, c'est largement suffisant
 
Valfunde

Valfunde

Helpeur Divin
Messages
3 800
Score réaction
1 235
Points
450
EpicGaby à dit:
D'ailleurs, comment sont codés les caractères sur GMod ?
1 octet par caractères ASCII
 
  • J'aime
Réactions: Membre supprimé 98332
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Valfunde à dit:
WriteString supporte jusqu'à 64k caractères, c'est largement suffisant
EpicGaby à dit:
transmettre de gros volumes de données de façon optimisée entre serveur / client
J'imagine qu'on dépasse la longueur maximale des 64Ko ?

Dans ce cas, il y a 3 solutions, ordonnées par simplicité décroissante :
  • Compression + WriteData : Une string à envoyer est compressée avec LZMA écrite dans un net avec WriteData (pour éviter l'altération WriteString), principe utilisé dans Sandbox pour partager les duplications. Note que c'est actuellement exploité pour faire des attaques par hashdos sur LuaJIT (cfr ArmDupe exploit).
  • WriteData + Split packets : La string à envoyer est séparée en morceaux et recomposée coté client. Un checksum/CRC peut être une bonne idée pour valider l'intégrité des données.
  • Via la library HTTP : Upload client->web puis web->gameserver

Selon le type de données, la performance entre le split packet et la compression peut varier, l'avantage du split packet c'est qu'il n'a pas de limite de taille et tu peux temporiser l'envoi pour éviter de faire un overflow.

Le plus rapide d'entre eux est celui qui utilise http, voici quelques tests :
Split packets :
========= Download complete =========
File path: logs/L0526001.log
File size: 9.48 MB
Time elapsed: 40 seconds
Average speed: 242.58 KB/s

HTTP :
========= Download complete =========
File path: maps/gm_flatgrass.bsp
File size: 45.23 MB
Time elapsed: 30 seconds
Average speed: 1.51 MB/s
 
Dernière édition:
  • J'aime
Réactions: Membre supprimé 98332
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
While True à dit:
J'imagine qu'on dépasse la longueur maximale des 64Ko ?

Dans ce cas, il y a 3 solutions, ordonnées par simplicité décroissante :
  • Compression + WriteData : Une string à envoyer est compressée avec LZMA écrite dans un net avec WriteData (pour éviter l'altération WriteString), principe utilisé dans Sandbox pour partager les duplications. Note que c'est actuellement exploité pour faire des attaques par hashdos sur LuaJIT (cfr ArmDupe exploit).
  • WriteData + Split packets : La string à envoyer est séparée en morceaux et recomposée coté client. Un checksum/CRC peut être une bonne idée pour valider l'intégrité des données.
  • Via la library HTTP : Upload client->web puis web->gameserver

Selon le type de données, la performance entre le split packet et la compression peut varier, l'avantage du split packet c'est qu'il n'a pas de limite de taille et tu peux temporiser l'envoi pour éviter de faire un overflow.

Le plus rapide d'entre eux est celui qui utilise http, voici quelques tests :
Split packets :
========= Download complete =========
File path: logs/L0526001.log
File size: 9.48 MB
Time elapsed :40 seconds
Average speed :242.58 KB/s

HTTP :
========= Download complete =========
File path: maps/gm_flatgrass.bsp
File size: 45.23 MB
Time elapsed: 30 seconds
Average speed: 1.51 MB/s
Je suis étonné de voir que 'upload + dl est bien + rapide qu'un envoi de données serveur-client :O
 
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Feytone à dit:
Je suis étonné de voir que 'upload + dl est bien + rapide qu'un envoi de données serveur-client :O
J'ai jamais dit que il y avait un dl, le serveur web peut être sur la même machine que le serveur de jeu, ce qui était le cas lors de mon test.
C'était donc de la communication client-serveur direct, mais passant par un service tiers.

Cela dit, même avec un serveur web distant, cela sera probablement plus rapide que la library net.
 
  • J'aime
Réactions: Valfunde
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
While True à dit:
J'ai jamais dit que il y avait un dl, le serveur web peut être sur la même machine que le serveur de jeu, ce qui était le cas lors de mon test.
C'était donc de la communication client-serveur direct, mais passant par un service tiers.

Cela dit, même avec un serveur web distant, cela sera probablement plus rapide que la library net.
Comment fonctionne le net lui ?
 
Discord d'entraide
Rejoignz-nous sur Discord