Savoir combien d'octets reçus avant ReceiveNetworkData()

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Savoir combien d'octets reçus avant ReceiveNetworkData()

Message 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.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

OK, mais ça serait je pense bien de pouvoir anticiper avant.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

perso, je trouve pas çà très logique.

comment connaitre avant ce qu'on a pas encore recu ?
Image
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Dans ce cas-là, on risque tout le temps de perdre des données !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message 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 ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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))
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Pourquoi des opérations dans la désignation du buffer ?

Code : Tout sélectionner

          res = ReceiveNetworkData(ClientID, *Buffer + (NbReAlloc - 1) * BufferLength,  BufferLength)
:?:
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

sinon il reecris pardessus
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message 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.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
Répondre