Problème avec ReceiveNetworkData

Programmation d'applications complexes
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Problème avec ReceiveNetworkData

Message par meganet »

Bonjour, j'ai fait une boucle pour récupérer tout ce qui arrive sur une connection réseau, et quant il à fini il ferme la connection.
Mais cette boucle ne me retourne pas tout ce qui arrive au bout d'un momment, il dit que c'est fini alors qu'il en manque.
J'ai essayé plains de truc, et je trouve rien.
Si quelqu'un pourrais me filer un coup de main?

Code : Tout sélectionner

Procedure.s ReceiveNetWorkDatas(Server$, Port)
If InitNetWork() = 0
ProcedureReturn ""
else

ClientID = OpenNetWorkConnection(Server$, Port)

While NetworkClientEvent(ClientID) <> 2
Delay(10)
Wend

Taille = 32000
Text$ = ""
*Buffer = AllocateMemory(Taille)
Restant = ReceiveNetworkData(ClientID,*Buffer,Taille)

Repeat
If restant <= 0
Text$ + PeekS(*Buffer, Restant)
FreeMemory(*Buffer)
Fini = 1
ElseIf Restant > 0
Text$ + PeekS(*Buffer, Taille)
*Buffer = ReAllocateMemory(*Buffer, Taille)
Restant = ReceiveNetworkData(ClientID,*Buffer,Taille)
EndIf

Until Fini = 1

CloseNetWorkConnection(ClientID)
ProcedureReturn Text$
EndIf
EndProcedure
Merci d'avance!
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Problème avec ReceiveNetworkData

Message par flaith »

Code : Tout sélectionner

Procedure.s ReceiveNetWorkDatas(Server$, Port)
If InitNetWork() = 0
ProcedureReturn ""
else

ClientID = OpenNetWorkConnection(Server$, Port)

While NetworkClientEvent(ClientID) <> 2
Delay(10)
Wend

Taille = 32000
Text$ = ""
*Buffer = AllocateMemory(Taille)
Restant = ReceiveNetworkData(ClientID,*Buffer,Taille)
; ************
Delay(1500)                               ;Toujours mettre un délai
; ************

Repeat
If restant <= 0
Text$ + PeekS(*Buffer, Restant)
FreeMemory(*Buffer)
Fini = 1
ElseIf Restant > 0
Text$ + PeekS(*Buffer, Taille)
*Buffer = ReAllocateMemory(*Buffer, Taille)
Restant = ReceiveNetworkData(ClientID,*Buffer,Taille)
; ************
Delay(1500)                               ;Toujours mettre un délai
; ************

EndIf

Until Fini = 1

CloseNetWorkConnection(ClientID)
ProcedureReturn Text$
EndIf
EndProcedure
Essaye avec un delai après le receive !
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Marche pas.

Message par meganet »

Salut, j'avait déjà essayer avec un delay après le premier mais pas dans la boucle, mais jvien d'essayer, ça marche pas nomplus.
La, il me donne 73 Ko de texte, alors que ce qu'il doit resevoir en fait que 57.
Je pence que ça doit être un pb au niveau de la condition, mais jvois pas le quel.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

j'avais fait un petit prog ya qq temps pour récupérer le syslog de mon modem/routeur, il a été librement inspiré du FTP_Lib de jesaisplusqui, si ca peut t'aider :

Code : Tout sélectionner

;-************************************
;-   NE PAS ACTIVER LE MODE UNICODE
;-************************************

#_Debug_ = 0

OpenConsole()
InitNetwork()

#CRLF = Chr(13) + Chr(10)
#MaxLines = 600

#Value_Time_Out = 2500

Global CLog.s
Global serveur$ = "10.0.0.138"     ;mettre le nom du serveur ou adr IP
Global port.l = 23
Global Longueur.l = 32000
Global CnxID.l

Global temp.s = "@", Temp_Txt.s, Txt.s, Text.s, SysLog.s
Global indice_tableau.l = 0, GetDATA.l, pos.l, Result.l
Global Dim Lignes.s(#MaxLines)

;-************************************
#nbcmd = 15
#nbopt = 9
Global Dim num_cmd.l(#nbcmd)
Global Dim lib_cmd.s(#nbcmd)
Global Dim num_opt.l(#nbopt)
Global Dim lib_opt.s(#nbopt)

Restore DATA_Command
For i = 0 To #nbcmd
  Read num_cmd(i)
Next i

Restore DATA_Command_lib
For i = 0 To #nbcmd
  Read lib_cmd(i)
Next i

Restore DATA_Option
For i = 0 To #nbopt
  Read num_opt(i)
Next i

Restore DATA_Option_lib
For i = 0 To #nbopt
  Read lib_opt(i)
Next i
;-************************************

Procedure.s Clean_DATA(TT.s,longueur.l)
Protected deb.l, Cmd_TXT.s, Cmd.l, i.l, j.l, k.l
; Print("HEX:")
; For i = 1 To longueur
;   Print(RSet(Hex(Asc(Mid(TT,i,1))),2,"0")+" ")
; Next i
; PrintN("")
;PrintN("Clean_DATA ("+tt+","+Str(longueur)+")")

deb = 1
Cmd_TXT.s = ""

  While deb <= longueur
    Cmd = Asc(Mid(TT,deb,1))
  
    If Cmd = 255      ;AIC
      Cmd_TXT = ""
      
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;         For k = deb To deb+2
;           Cmd = Asc(Mid(TT,k,1))
;           Print("|"+RSet(Hex(Cmd),2,"0")+"|")
;           For i = 0 To #nbcmd
;             If num_cmd(i) = Cmd : Print(" "+lib_cmd(i)+" ") : EndIf
;           Next i
;   
;           For j = 0 To #nbopt
;             If num_opt(j) = Cmd : Print(" "+lib_opt(j)+" ") : PrintN("") : EndIf
;           Next j
;         Next k
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      
      deb + 2
    Else
      Cmd_TXT + Chr(Cmd)
    EndIf
    deb + 1
  Wend

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;     PrintN("ASC:|"+Cmd_TXT+"|")
;     PrintN("----------------------")
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  ProcedureReturn Cmd_TXT
EndProcedure

Procedure.s GET_Data(connection.l)
Protected Time_Out.l = #Value_Time_Out

  *BufferMemoire = AllocateMemory(Longueur)

  If *BufferMemoire > 0
    Command.s = "" : Text.s = ""

    Repeat
      t1 = ElapsedMilliseconds()
      Size = -1
    
      Repeat
        Result = NetworkClientEvent(CnxID)
        If Result <> 2 : Delay(10) : EndIf
        t2 = ElapsedMilliseconds()-t1
      Until (Result = 2 Or t2 >= Time_out)

      If Result > 0 ; = 2
        Taille = ReceiveNetworkData(CnxID, *BufferMemoire, Longueur)
        Size = Taille
        If Size
          Text + PeekS(*BufferMemoire,Size)
        EndIf
      Else
;         PrintN("Break - Size = "+Str(size))
        Break
      EndIf

      If size > 150
        Time_out = 1000
      Else
        Time_out = 50
      EndIf
      
    Until size < 1
    
    If Text
      Command=Clean_DATA(Text,Taille)
;       PrintN("*** Command ***")
    Else
      Command = "<NO_DATA>"
;       PrintN("Command = "+Command)
    EndIf
    FreeMemory(*BufferMemoire)

    ProcedureReturn Command
    
  Else
    PrintN("*** ERROR: Cannot allocate memory !")
    End
  EndIf

EndProcedure

;-************************************

Print("PROTOCOLE TELNET  ==> ")
PrintN("http://www.scit.wlv.ac.uk/~jphb/comms/telnet.html") : PrintN("")

CnxID = OpenNetworkConnection(Serveur$, Port)

PrintN("ID Connexion : "+Str(CnxID))
PrintN("----------------------")

If CnxID
  b$="" : c$=""
  PrintN("=>TELNET on "+serveur$+" PORT "+Str(Port)+" ...")
  GET_Data(CnxID)
  user$=GET_Data(CnxID)
  If UCase(Left(user$,4)) = "USER"
    PrintN("=>Sending Username ...")
    SendNetworkString(CnxID, "<user_name>"+#CRLF)
    Delay(1500)

    SendNetworkString(CnxID, "<password>"+#CRLF)
    PrintN("=>Sending Password ...")
    Delay(1500)

    SendNetworkString(CnxID, "systemlog show"+#CRLF)
    PrintN("=>List of SystemLog (wait a while)...")
    Delay(1500)

    GetDATA = #True                           ; On charge les données du routeur
    Txt = GET_Data(CnxID)
    SysLog = Txt
    pos = FindString(Txt, #CRLF, 1)           ; Obligatoire de faire une 1ère recherche

    While GetDATA                            ; Tant que l'on a pas "=>"
      temp=Mid(Txt,1,pos-1)                   ; on extrait la partie avant le #CRLF
      If txt = "<NO_DATA>"
        GetDATA = #False                      ; On arrête de charger les données du routeur
      Else
        Txt = GET_Data(CnxID)
        SysLog + Txt
      EndIf
    Wend

    PrintN("Syslog = "+SysLog)

;-************************************
    PrintN("")
  Else
    PrintN("*** ERROR: Cannot find label 'Username' !"+#CRLF+"DUMP:"+user$)
    End
  EndIf
      
  CloseNetworkConnection(CnxID)
Else
  PrintN("Connexion a echoué !")
EndIf

PrintN("")
Print("Appuyez sur [Entree] pour quitter")
Input()
CloseConsole()
End

DataSection

  DATA_Command:
    ; nb=16
    Data.l 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255

  DATA_Command_lib:
    Data.s "SE","NOP","DM","BRK","IP","AO","AYT","EC","EL","GA","SB"
    Data.s "WILL","WONT","DO","DONT","-IAC-"
  
  DATA_Option:
    ; nb=10
    Data.l 1,3,5,6,24,31,32,33,34,36

  DATA_Option_lib:
    Data.s "ECHO","SUPPRESS_GO_AHEAD","STATUS","TIMING_MARK","TERMINAL_TYPE"
    Data.s "WINDOW_SIZE","TERMINAL_SPEED","REMOTE_FLOW_CONTROL","LINEMODE"
    Data.s "ENVIRONMENT_VARIABLES"
  
EndDataSection
:)
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Sayait j'ai trouver.

Message par meganet »

Sa y est, j'ai trouver.
Vue que ma procedure est fête pour télécharger des donnée http, j'ai utiliser la taille renvoyé par le serveur http pour avoir la bonne taille.
Encore merci.
Répondre