[RESOLU]ReceiveNetworkData en plusieurs fois!!!!!

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

[RESOLU]ReceiveNetworkData en plusieurs fois!!!!!

Message par Fortix »

Bonsoirs :D

j'ai un petit soucis avec cette fonction "ReceiveNetworkData" :oops:
comme vous savez, on peut créer le fichier reçut seulement quand
il n'y a plus de paquet en cours de réception, donc comment faire??

*Buffer = AllocateMemory(1000)
Repeat
SEvent = NetworkServerEvent()

If SEvent
ClientID = EventClient()
Debug SEvent

Select SEvent
Case #PB_NetworkEvent_Connect
Debug ""
Debug "Serveur - Le client "+IPString(GetClientIP(ClientID))+" est connecté"

Case #PB_NetworkEvent_Data
rf=ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))



Debug "Progression de la reception "+Str(rf)+" octets"

If rf=MemorySize(*Buffer)
Debug "Chargement fichier pas encore finit........."
Else
Debug "enfin écriture fichier!"

If CreateFile(1,"c:\recept_Data\tmp")
WriteData(1,*Buffer,rf)
CloseFile(1)
EndIf
EndIf


Case #PB_NetworkEvent_Disconnect
Debug "Serveur - le client "+IPString(GetClientIP(ClientID))+" vient de se déconnecter"

EndSelect
EndIf

Delay(1000)
ForEver


et pourtant j'en suis sûr que la solution est simple, mais je n'y arrive pourtant pas :oops:
donc si vous avez des idées, surtout n'hezitez pas :D
Dernière modification par Fortix le dim. 19/mai/2013 19:01, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par nico »

Code : Tout sélectionner

comme vous savez, on peut créer le fichier reçut seulement quand
il n'y a plus de paquet en cours de réception, donc comment faire??
C'est faux, tu as choisis dans ton code d'attendre la fin mais tu n'y est pas obligé.

Code : Tout sélectionner

LongueurBuffer.l = 4096

*Buffer = AllocateMemory(LongueurBuffer)

If CreateFile(1,"c:\recept_Data\tmp")  = 0
  MessageRequester("Info", "Impossible de créer le fichier!")
EndIf


Repeat
  SEvent = NetworkServerEvent()
  
  If SEvent
    ClientID = EventClient()
    Debug SEvent
    
    Select SEvent
      Case #PB_NetworkEvent_Connect
        Debug ""
        Debug "Serveur - Le client "+IPString(GetClientIP(ClientID))+" est connecté"
        
      Case #PB_NetworkEvent_Data
        If IsFile(1) <> 0
          rf = ReceiveNetworkData(ClientID, *Buffer, LongueurBuffer)
          
          Debug "Progression de la reception "+Str(rf)+" octets"
          
          If rf = LongueurBuffer
            Debug "Chargement fichier pas encore finit........."
            WriteData(1, *Buffer,rf) 
          ElseIf rf = -1
            Debug "Une erreur s'est produite pendant la connexion!"
            CloseFile(1)    
          Else	
            Debug "enfin écriture fichier!"
            CloseFile(1)
          EndIf
        EndIf
      
      
    Case #PB_NetworkEvent_Disconnect
      Debug "Serveur - le client "+IPString(GetClientIP(ClientID))+" vient de se déconnecter"
      
  EndSelect
EndIf

Delay(1000)
ForEver
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par Fortix »

Impeccable :D
merci

mais pourquoi le "LongueurBuffer" est à 4096 précisément?
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par Golfy »

De mémoire, c'est la taille maximale du buffer réseau.

pour certain code (pas forcément du transfert de fichier), il peut-être utile de gérer un timeout :

Code : Tout sélectionner

d=EllapsedMillisecond()
repeat
  If NetworkClientEvent(ClientID) = #PB_NetworkEvent_Data
     (((((actions))))))
     d=EllapsedMillisecond()
  endif
until infoOK or EllapsedMillisecond()-d > Timeout
Ainsi, si tu ne reçois rien pendant "timeout" millisecondes, tu peux effectuer un traitement...
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par nico »

Oui mais attention, tu ne pourras pas faire cela avec ReceiveNetworkData car c'est une fonction bloquante, d'ailleurs comment est gérer le timeout sur cette fonction, j'ai pas vu dans l'aide.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par Golfy »

nico a écrit :Oui mais attention, tu ne pourras pas faire cela avec ReceiveNetworkData car c'est une fonction bloquante, d'ailleurs comment est gérer le timeout sur cette fonction, j'ai pas vu dans l'aide.
Tu me surprend 8O

Une fois que tu as NetworkClientEvent qui te prévient que tu as des données dans le buffer, il n'y a plus qu'à les lire (dans les actions) avec

Code : Tout sélectionner

RXLen = ReceiveNetworkData(ClientID, *BNin, 4096)
Dans ce cas (et peut-être n'ai-je pas compris le fonctionnement), une fois la lecture faite, cela libère la quantité de données disponibles dans le buffer réseau. en tout cas, c'est comme cela que j'utilise la lecture réseau.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par nico »

Je viens de faire des essais et apparemment cela ne bloque pas car comme tu le dis, si on a #PB_NetworkEvent_Data, c'est que les données sont prête à être récupérées. Cela signifirais donc aussi que ton timeout n'est d'aucune utilité car géré en amont.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ReceiveNetworkData en plusieurs fois!!!!!

Message par Golfy »

nico a écrit :Je viens de faire des essais et apparemment cela ne bloque pas car comme tu le dis, si on a #PB_NetworkEvent_Data, c'est que les données sont prête à être récupérées. Cela signifierais donc aussi que ton timeout n'est d'aucune utilité car géré en amont.
oui et non...

oui car il n'y a pas de blocage...
... et non car si tu attends un fichier de 8192 octets (par hasard 2x4096 :wink: ) et qu'une trame se perde (la deuxième) : au bout d'un timeout tu peux décider que la transmission s'est interrompue et que tu ne dois plus attendre la deuxième partie (ou bien faire une relance)

Pour ma domotique Velbus, chaque message entraîne une réponse dans les quelques dixièmes de secondes mais au-delà de 3 sec, je suis certain que d'autres messages prioritaires ont monopolisés le BUS et que le module n'enverra plus sa réponse (ou bien que le module USB n'a pas pu lire la réponse). Par contre je suis obligé de faire une boucle car d'autres événements peuvent arriver entre ma commande et la réponse)...
Un peu comme le protocole UDP 8)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Répondre