Page 1 sur 1
Savoir combien d'octets reçus avant ReceiveNetworkData()
Publié : dim. 27/févr./2005 22:39
par gansta93
Bonjour,
Il serait bien qu'il y ait une comande pour savoir le nombre d'octets reçus lorsque l'on a l'évènement réseau qui indique que des données ont étées reçues aussi bien client que serveur.
Publié : lun. 28/févr./2005 7:45
par cederavic
ReceiveNetworkData()
Syntaxe
Resultat = ReceiveNetworkData(ConnectionID, *BufferMemoire, Longueur)
Description
Reçoit une donnée brute du client ClientID. Cette fonction peut être utilisée par une application Serveur ou Client. Côté serveur, 'ConnectionID' identifie le client qui a envoyé les données (ConnectionID peut être obtenu simplement avec la fonction NetworkClientID()). Côté client, 'ConnectionID' est retourné par la commande OpenNetworkConnection(). Les données sont lus directement dans la zone mémoire '*BufferMemoire'. 'Resultat' contient le nombre d'octets effictivements lus par la fonction. Si 'Resultat' est égal à 'Longueur', alors il reste des données en attente à lire.
OS Supportés
Windows, AmigaOS, Linux

Publié : lun. 28/févr./2005 10:09
par gansta93
OK, mais ça serait je pense bien de pouvoir anticiper avant.
Publié : lun. 28/févr./2005 10:55
par Flype
perso, je trouve pas çà très logique.
comment connaitre avant ce qu'on a pas encore recu ?
Publié : lun. 28/févr./2005 11:02
par gansta93
Dans ce cas-là, on risque tout le temps de perdre des données !
Publié : lun. 28/févr./2005 12:41
par Flype
mais non il suffit de faire une boucle de chargement.
les fonctions reseaux, je suis d'accord avec toi, c'est peut etre pas le plus simple à programmer mais bon il faut mettre en oeuvre une boucle, un algorithme de ce genre ( et dans d'autre langage c encore plus galere ) :
tant qu'il reste des données à charger on relance ReceiveNetworkData() jusqu'a ce que Result renvoyé par cette meme fonction soit egal à zero.
Publié : lun. 28/févr./2005 12:46
par gansta93
Mais alors... ce qui était avant dans le buffer avant d'appeler ReceiveNetworkData() sera écrasé lors du deuxième appel et ainsi de suite non ?
pourais-tu me faire un exemple stp ?
Comment fonctionnait la commande ReceiveNetworkString() ?
quelle était sa syntaxe ?
Publié : lun. 28/févr./2005 17:16
par cederavic
comme ceci je pense (dumoin c'est comme ça que je procède moi) :
Code : Tout sélectionner
NbReAlloc = 1
BufferLength = 3
*Buffer = AllocateMemory(BufferLength)
Repeat
res = ReceiveNetworkData(ClientID, *Buffer + (NbReAlloc - 1) * BufferLength, BufferLength)
If res = BufferLength
NbReAlloc + 1
*Buffer = ReAllocateMemory(*Buffer, NbReAlloc * BufferLength)
EndIf
Until res = -1
PrintN("Client " + Str(ClientID) + " : " + PeekS(*Buffer))
Publié : lun. 28/févr./2005 17:24
par gansta93
Pourquoi des opérations dans la désignation du buffer ?
Code : Tout sélectionner
res = ReceiveNetworkData(ClientID, *Buffer + (NbReAlloc - 1) * BufferLength, BufferLength)

Publié : lun. 28/févr./2005 17:27
par cederavic
sinon il reecris pardessus
Publié : lun. 28/févr./2005 17:34
par gansta93
Ah OK... et donc avec le realocatememory() ça revient à écrire tout le temps dans le même buffer ?
Pas vraimant sûr de comprendre... dsl.
Publié : lun. 28/févr./2005 17:55
par Oliv
Moi je fais comme ça pour les gros fichiers, c'est peut-être pas très propre mais ça marche bien

:
Code : Tout sélectionner
*Buffer.l = AllocateMemory(20000)
; Code de ton programme
CreateFile(0,"Fichier")
Repeat
*Buffer = ClearMemory(*Buffer,20000)
Taille.l = ReceiveNetworkData(ClientID,*Buffer)
If Taille = 20000
WriteData(*Buffer,20000)
Else
WriteData(*Buffer,len(PeekS(*Buffer)))
Break
EndIf
ForEver
CloseFile(0)
J'ai fait une petite lib juste avec ClearMemory() dedans (grace à TailBite

) qui permet de juste faire une commande au lieu de AllocateMeMory() et FreeMemory() mais de redimensionner à souhait
Code : Tout sélectionner
Procedure ClearMemory(*Buffer.l,Taille.l)
FreeMemory(*Buffer)
ProcedureReturn AllocateMemory(Taille)
EndProcedure