Problème avec SendnetworkString

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Problème avec SendnetworkString

Message par Torp »

Salut,

j'ai fais un truc du genre (j'ai pas mis tout mon code):

Coté serveur :

Code : Tout sélectionner

for i=1 to 9
  sendnetworkstring(connectionID,str(i))
next i
et coté client ca :

Code : Tout sélectionner

Repeat
    Net_Event=NetworkClientEvent(ConnectionID)
    Select Net_Event 
      Case 2
        ReceiveNetworkData(ConnectionID,Buffer,500)
        Transfert$=PeekS(Buffer)
        Buffer=ClearMemory(Buffer,500)
        debug Transfert$
    EndSelect
Forever

Procedure ClearMemory(Memory,Taille)
  FreeMemory(Memory)
  ProcedureReturn AllocateMemory(Taille)
EndProcedure
Et bien à le place de recevoir :
1
2
..
8
9

etc...

Je recois :

123456789

En gros je ne recois qu'un seul paquet avec tout dedans, au lieu d'en recevoir 9...

Il y a une explication ou c'est un bug?
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Je pense que côté client tu dois tester combien de packets sont envoyés. Une fois que tu as fait ce test tu fais une boucle avec recievenetworkdata

C'est juste une idée, je dis ca car en fait les paqket arrivent très rapidement avec la boucle repeat , le test select n'a pas le temps de se faire que tous les packets sont déjà arrivés de plus le select teste la réception de packet suivant la connexionID, les packets provenant de la meme id....

Je dis ca comme car je dois avouer que je me suis jamais penché sur le réseau avec Pure. C'est une idée juste, si elle est idiote ben....tant pis j'aurais l'air d'un con une fois de plus :jesors:
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Moi j'ai toujours vu ça aussi :cry: , alors je sépare par un zoli Eol : chr(13) + chr(10)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

N'oubliez pas les noeuds colorés sur les paquets :jesors:
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

En fait je pense que c'est un problème de rapidité de la commande SendNetworkString. On dirait que son buffer se rempli dans la boucle, avant meme qu'elle ai eu le temps d'envoyer quoi que ce soit. Et quand elle se decide, ben elle envoie tout d'un coup. Si par exemple je mets un delay(10) dans la boucle, elle m'envoie le 1 puis un autre paquet avec 23456789... 8O

Je pense qu'il y a un truc à synchroniser mais alors la ... :?

Si quelqu'un a une soluce...

Oliv: Avec Chr(13)+Chr(10), celà permet de découper les paquets? Ou c'est des repères pour redécouper coté client?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

C'est tout à fait normal, c'est comme ça que tcp/ip gère le transfert de paquets. La seule façon est d'utiliser l'udp, mais faudra chercher par vous-même.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Houlà, Ca se complique... :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Torp a écrit : Oliv: Avec Chr(13)+Chr(10), celà permet de découper les paquets? Ou c'est des repères pour redécouper coté client?
C'est pour les découper, en fait j'ai surtout pris l'habitude de les utiliser avec les protocoles POP/SMTP/IRC.
Pour l'UDP il y a des exemples sur le forum anglais : ça a l'air un peu compliqué 8O
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

ou le tcp ip le gère ainsi mais il y a toujours moyen de découepr. Le pb c que c un peu la galère et c'est long.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Ben finalement j'ai pris l'option découpage... J'ai pris comme séparateur ":" et j'utilise la fonction StringField.

Ensuite j'ai fait 2 procedures et j'utilise l'une ou l'autre suivant si c'est du texte ou des valeurs numeriques que je recois :

Code : Tout sélectionner

Procedure.s DecodStr(Donnee.s,i.l)
  ProcedureReturn  StringField(Donnee,i,":")
EndProcedure

Procedure.l DecodVal(Donnee.s,i.l)
  ProcedureReturn Val(StringField(Donnee,i,":"))
EndProcedure
Je me demerde avec ce que je comprends.. :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Torp a écrit :Ben finalement j'ai pris l'option découpage... J'ai pris comme séparateur ":" et j'utilise la fonction StringField.

Ensuite j'ai fait 2 procedures et j'utilise l'une ou l'autre suivant si c'est du texte ou des valeurs numeriques que je recois :

Code : Tout sélectionner

Procedure.s DecodStr(Donnee.s,i.l)
  ProcedureReturn  StringField(Donnee,i,":")
EndProcedure

Procedure.l DecodVal(Donnee.s,i.l)
  ProcedureReturn Val(StringField(Donnee,i,":"))
EndProcedure
Si tu as des questions pose :wink: Le forum est fait pour ça

Je me demerde avec ce que je comprends.. :)
Répondre