Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

445 connectés actuellement

29433885 visiteurs
depuis l'ouverture

8261 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Hellsoft

RPG Maker Détente

Offgame

RPG Maker VX

Lunae - le bazar d'Emz0

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RPG Maker XP] Socket/recv()


Maître - posté le 11/11/2012 à 21:21:23 (24 messages postés)

❤ 0

Maître heu..., de Oniromancie ?

Domaine concerné: Scripts
Logiciel utilisé: RPG Maker XP
Hello, voila j'utilise un script "Socket" pour faire 2-3 tests, et j'aimerais savoir comment faire pour éviter que le jeux ce bloque quand j'utilise le recv().
Pour commencer, le script en question:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
module Socket
   #--------------------------------------------------------------------------
   # * Win32API
   #--------------------------------------------------------------------------
   Socket = Win32API.new('ws2_32', 'socket', 'lll', 'l')
   Connect = Win32API.new('ws2_32', 'connect', 'ppl', 'l')
   Close = Win32API.new('ws2_32', 'closesocket', 'p', 'l')
   Send = Win32API.new('ws2_32', 'send', 'ppll', 'l')
   Recv = Win32API.new('ws2_32', 'recv', 'ppll', 'l')
   Inet_addr = Win32API.new('ws2_32', 'inet_addr', 'p', 'l')
   Htons = Win32API.new('ws2_32', 'htons', 'l', 'l')
   Shutdown = Win32API.new('ws2_32', 'shutdown', 'pl', 'l')
   #--------------------------------------------------------------------------
   # * Constants
   #--------------------------------------------------------------------------
   AF_INET = 2
   SOCK_STREAM = 1
   #--------------------------------------------------------------------------
   # * Singleton
   #--------------------------------------------------------------------------
   class << self
      #--------------------------------------------------------------------------
      # * Creating the SOCKADDR_IN
      #--------------------------------------------------------------------------
      def sockaddr_in(host, port)
         sin_family = AF_INET
         sin_port = Htons.call(port)
         in_addr = Inet_addr.call(host)
         sockaddr_in = [sin_family, sin_port, in_addr].pack('sSLx8')
         return sockaddr_in
      end
      #--------------------------------------------------------------------------
      # * Creating the Socket
      #--------------------------------------------------------------------------
      def socket() return Socket.call(AF_INET, SOCK_STREAM, 0) end
      #--------------------------------------------------------------------------
      # * Connecting
      #--------------------------------------------------------------------------
      def connect_sock(sock, sockaddr)
         if Connect.call(sock, sockaddr, sockaddr.size) == -1
         p "Impossible to connect"
         return
         end
         p "Successfully connected"
      end
      #--------------------------------------------------------------------------
      # * Connecting
      #--------------------------------------------------------------------------
      def connect(host = "127.0.0.1", port = 9999)
         sockaddr = sockaddr_in(host, port)
         sock = socket()
         connect_sock(sock, sockaddr)
         return sock
      end
      #--------------------------------------------------------------------------
      # * Sending data
      #--------------------------------------------------------------------------
      def send(socket, data)
         value = Send.call(socket, data, data.length, 0)
         if value == -1
            p "Failed to send"
            shutdown(socket, 2)
            return false
         end
         #p "Successfully sent"
         return true
      end
      #--------------------------------------------------------------------------
      # * Receiving data
      #--------------------------------------------------------------------------
      def recv(socket, len = 256)
         buffer = [].pack('x'+len.to_s)
         value = Recv.call(socket, buffer, len, 0)
         return buffer.gsub(/\x00/, "") if value != -1
         return false
      end
      #--------------------------------------------------------------------------
      # * Stops the emission
      #--------------------------------------------------------------------------
      def shutdown(socket, how) Shutdown.call(socket, how) end
      #--------------------------------------------------------------------------
      # * Closes the connection
      #--------------------------------------------------------------------------
      def close(socket) Close.call(socket) end
   end
 end


Je m'explique, l'envoie et la reception des données fonctionne, mes en jeu quand j'utilise le:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
      #--------------------------------------------------------------------------
      # * Receiving data
      #--------------------------------------------------------------------------
      def recv(socket, len = 256)
         buffer = [].pack('x'+len.to_s)
         value = Recv.call(socket, buffer, len, 0)
         return buffer.gsub(/\x00/, "") if value != -1
         return false
      end


et que sa ne retourne rien, le jeu plante...
Pour moi ya pas de doute sa vien de Recv.call(socket, buffer, len, 0), j'ai testé avec un Thread mes c'est toujours pareille.

Y a t'il un moyen d’évité que le jeu plante quand le Recv.call(socket, buffer, len, 0) retourne rien ?

Message ?


Grim - posté le 11/11/2012 à 23:19:11 (251 messages postés)

❤ 0

Non, normalement, quand j'ai écris ce module c'était pour recevoir des messages du serveur après un envoi et il fallait utiliser la commande "wait_for_recv" dans le module Commande. Sinon tu peux traité la nilité du retour avec un serveur qui envoi beaucoup de messages vides...

Edit : Je réécris l'event extender complètement et je réécrirais la couche Socket (qui est uniquement anectodique)

http://funkywork.github.io/


Maître - posté le 12/11/2012 à 18:20:12 (24 messages postés)

❤ 0

Maître heu..., de Oniromancie ?

Citation:

Non, normalement, quand j'ai écris ce module c'était pour recevoir des messages du serveur après un envoi et il fallait utiliser la commande "wait_for_recv" dans le module Commande.


Oui, du coup le serveur peux pas send() tant que le client lui demande pas, car le client peux pas savoir si le serveur envoie des données au risque de faire planter le jeu x).

Citation:

Sinon tu peux traité la nilité du retour avec un serveur qui envoi beaucoup de messages vides...


Je me suis dit la même chose, mes sa va pas le faire, sa prendra beaucoup de ressources pour pas grand chose, en plus sa va rendre les traitements des données plus chiant (surtout si la connexion et lente le jeu va bloqué le temps de la réception).

Message ?


Grim - posté le 12/11/2012 à 18:25:41 (251 messages postés)

❤ 0

Oui mais RM n'est pas fait pour ça ...
Mais comme je te l'ai dit, je travaille actuellement sur la V2 de mon script seulement c'est un peu plus compliqué que prévu ^^ et ce n'est pas dans mes priorité pour le moment.
Bonne chance :)

http://funkywork.github.io/


Maître - posté le 13/11/2012 à 21:12:00 (24 messages postés)

❤ 0

Maître heu..., de Oniromancie ?

Citation:

Oui mais RM n'est pas fait pour ça ...


Ouép dommage d’ailleurs..

En tout cas bon courage pour la v2 : D

Message ?


Nagato Yuki - posté le 13/11/2012 à 23:52:01 (351 messages postés)

❤ 0

RM n'est pas fait pour à l'origine mais cela n'empêche que ça fonctionne correctement. J'ai pas une version aussi simplifié que ça de TCPSocket chez moi mais tout fonctionne correctement tant que je respecte le protocole du serveur. (La seule chose qui ne fonctionne pas est la résolution de localhost mais 127.0.0.1 fonctionne normalement et j'ai coder deux fonctions en c++ qui permettent de vérifier l'existence d'un serveur par son DNS et si il est connecté.)

Normalement le jeu ne devrait pas se bloquer lorsque tu fais un recv car au moment où tu le fais tu devrais avoir reçus les données. (Il existe des exceptions comme les connexion à 5octets par secondes mais bon ;b)

Sinon tu peux coder tout ça en dur dans une DLL, ça serait plus sûr et tu pourras créer un vrai Thread détaché de ruby. (Fais un simple collecteur de données par exemple).

Pokémon Workshop, le site de Making Pokémon sur RPG Maker~


Grim - posté le 13/11/2012 à 23:57:17 (251 messages postés)

❤ 0

Je planchais (grâce à Zeus) à l'utilisation d'une DLL tierce... mais le soucis c'est que je devrais demander à l'utilisateur de devoir télécharger un fichier.
C'est encore en réflexion.
Pour cette gestion des sockets, c'est très minimaliste mais il est possible de faire des choses je pense.
pour le wait_recv c'est surtout pour être utilisé en "event making" (puisque il s'intègre dans un script destiné aux events makers).

http://funkywork.github.io/

Index du forum > Entraide > [RPG Maker XP] Socket/recv()

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers