Savoir combien d'octets reçus avant ReceiveNetworkData()
Savoir combien d'octets reçus avant ReceiveNetworkData()
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.
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.
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

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.
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.
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))
Pourquoi des opérations dans la désignation du buffer ?

Code : Tout sélectionner
res = ReceiveNetworkData(ClientID, *Buffer + (NbReAlloc - 1) * BufferLength, BufferLength)

Moi je fais comme ça pour les gros fichiers, c'est peut-être pas très propre mais ça marche bien
:
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
*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)


Code : Tout sélectionner
Procedure ClearMemory(*Buffer.l,Taille.l)
FreeMemory(*Buffer)
ProcedureReturn AllocateMemory(Taille)
EndProcedure