Bienvenue visiteur !
|
Désactiver la neige
Statistiques
Liste des membres
Contact
Mentions légales
467 connectés actuellement
30912755 visiteurs depuis l'ouverture
2391 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
Maître -
posté le 11/11/2012 à 21:21:23 (24 messages postés)
| 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:
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:
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)
| | 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)
| 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)
| | 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)
| 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)
| | 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)
| | 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()
|
|
|