Page 1 sur 1

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

Publié : jeu. 04/avr./2013 19:35
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

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 9:50
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

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 17:18
par Fortix
Impeccable :D
merci

mais pourquoi le "LongueurBuffer" est à 4096 précisément?

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 17:29
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...

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 17:47
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.

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 21:12
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.

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 22:19
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.

Re: ReceiveNetworkData en plusieurs fois!!!!!

Publié : ven. 05/avr./2013 23:38
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)