Page 1 sur 1

Problème avec SendnetworkString

Publié : lun. 07/mars/2005 13:50
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?

Publié : lun. 07/mars/2005 16:24
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:

Publié : lun. 07/mars/2005 16:27
par Oliv
Moi j'ai toujours vu ça aussi :cry: , alors je sépare par un zoli Eol : chr(13) + chr(10)

Publié : lun. 07/mars/2005 16:30
par Crystal Noir
N'oubliez pas les noeuds colorés sur les paquets :jesors:

Publié : lun. 07/mars/2005 16:52
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?

Publié : lun. 07/mars/2005 18:17
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.

Publié : lun. 07/mars/2005 18:30
par Torp
Houlà, Ca se complique... :)

Publié : lun. 07/mars/2005 20:40
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

Publié : lun. 07/mars/2005 23:20
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.

Publié : mar. 08/mars/2005 0:14
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.. :)

Publié : mar. 08/mars/2005 16:43
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.. :)