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
:P

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 :D :

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 :P ) 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