Probleme de fiabilité winsock ftp

Signaler
Messages postés
4
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
4 janvier 2010
-
Messages postés
4
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
4 janvier 2010
-
Bonjour à tous

Je tente de finaliser une une appli en vb6 qui me permet de construire et
d'envoyer des fichiers vers le ftp d'un automate de maniére cyclique toutes les 5 secondes et aussi évenementiel sur bp envoyer.
Pour la partie construction de fichier pas de prblm, pour la partie transfert de fichier j'utile les winsock qui fonctionne pas mal sauf que par moment la com "plante" !! et il me semble quel plante quand je fait autre chose même tres simple du style déplacer une fenetre ou changer d'onglet ... bref quand je déclenche un autre événement.

Pourtant toute ma partie winsock est sur une form indépendante.

On dirait que je loupe des reponses du serveur ftp.
quelqun pourait-il m'aider svp !!
je suis automaticien de base donc plus de la prog cyclique que la prog évenementielle.
d'avance merci.

6 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
37
salut,

je présume que tu t'attends à une réponse plus spirituelle que "tu as une erreur à la ligne 47" ??


[hr]
Messages postés
4
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
4 janvier 2010

Ben en fait je pense que ce n'est pas une erreur sur une ligne en particulier, mais le fait de réaliser une action au moment ou le serveur ftp attend quelque chose de ma part
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
37
pareil, pour le savoir faut montrer ton code

as-tu regardé les sources existantes?
winsock est évènementiel, l'utilises-tu bien de cette manière?
j'peux te poser 50 questions comme çà .... : montre ton code on ira plus vite
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
Si tu as un message (erreur ou arrêt protocolaire), il serait bon de dire lequel, que l'on sache qui/quoi provoque l'erreur.
La réponse est souvent dans le texte de l'erreur.

D'autre part, transférer un fichier toutes les 5 sec me semble limite, mais tout dépend de la taille du fichier.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
4
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
4 janvier 2010

tout d'abord merci de vos reponses.
mes fichiers font maxi 10K don pas énormes. si je démarre l'appli et que je la laisse tourné sans y touché pas de prob.


Voici mon code au k ou (cela fait seulement 15j que g découvert VB donc toute vos remarques ou critiques seront pour moi des conseils)
Encore merci de votre aide.

Public Sub Command1_Click()
Reset
ftp_fichier = "prog.po"
cmde_ftp ("RETR ")
End Sub

Private Sub Form_Load()
FTP.Close
status.Text = "connection ..."
FTP.Connect
End Sub
Private Sub FTP_Close()
status.Text = "connection terminée"
End Sub

Private Sub FTP_Connect()
status.Text = "connection ok"
FTP.SendData "USER datastorage" & vbCrLf
End Sub

Private Sub FTP_DataArrival(ByVal bytesTotal As Long)
Dim z As Integer
Dim ff As Integer
Dim ff2 As Integer
Dim annee As String, mois As String, jour As String, tempo As String, name As String, rep As String

ftp_texte_recu = vbNullString
FTP.GetData ftp_texte_recu, bytesTotal

Dim temp() As String
Dim ax As String
Dim i As Integer

temp = Split(ftp_texte_recu, Chr(10))
ax = temp(UBound(temp) - 1)

For i = 0 To UBound(temp) - 1
Text3 = Text3 & Now & " " & temp(i) & vbCrLf & " " & " " & " "
Text3.SelStart = Len(Text3) - 1
Next i
code_reponse = Left(ftp_texte_recu, 3)
code.Text = code_reponse

If ftp_const_code_rep = 220 Then
ftp_construct.SendData "USER datastorage" & vbCrLf
End If

If code_reponse = 331 Then
status.Text = "demande log"
FTP.SendData "PASS datadownload" & vbCrLf
End If

If code_reponse = 230 Then

status.Text = "log ok connecté"
If marqueur = True Then 'And ftp_fichier <> "base.traca" And ftp_fichier <> "base.al" Then
status.Text = "dm traca"
ftp_fichier = "base.traca"
cmde_ftp ("RETR ")
End If
End If
If code_reponse = 215 Then
FTP.SendData "TYPE I" & vbCrLf
End If

If code_reponse = 200 Then
status.Text = Val(marqueur)

End If

If code_reponse = 227 Then
Call calcul_port(ftp_texte_recu)
port_ouvert = True
status.Text = "Attente commande"

End If


If code_reponse = 226 Then
code.Text = code_reponse & " ok "
If commande2 = "STOR " Then
status.Text = "envoie ok"
FTP_up.Close
modif_prg = False
If ftp_fichier = "prog.po" Then
modif_prg = False
nouv_prg = 0
End If
If ftp_fichier = "produits.prod" Then
ftp_fichier = "fiche_prod.prod"
cmde_ftp ("STOR ")
End If
End If


If commande2 = "RETR " Then
If ftp_fichier "base.traca" Or ftp_fichier "base.al" Then
tempo = Date$
annee = Year(tempo)
mois = Month(tempo)
jour = Day(tempo)
If ftp_fichier = "base.traca" Then ' enchaine avec le fichier alarme
rep = Dir("C:\fichier duranel\archive" & annee, vbDirectory)
If rep = "" Then
If rep <> ".." Then
If rep <> "." Then

MkDir ("C:\fichier duranel\archive" & annee)

End If
End If
End If
rep = Dir("C:\fichier duranel\archive" & annee & "" & mois, vbDirectory)
If rep = "" Then
If rep <> ".." Then
If rep <> "." Then

MkDir ("C:\fichier duranel\archive" & annee & "" & mois)
End If
End If
End If


free = FreeFile
name = "C:\fichier duranel\archive" & annee & "" & mois & "" & annee & "_" & mois & "_" & jour & ".traca"
Open (name) For Output As #free
Print #free, ftp_buffer_recp
Close #free
FTP_down.Close

status.Text = "Retour f traca ok"
ftp_fichier = "base.al"
cmde_ftp ("RETR ")
Else
If ftp_fichier = "base.al" Then
name = "C:\fichier duranel\archive" & annee & "" & mois & "" & annee & "_" & mois & "_" & jour & ".al"
Open (name) For Output As #free
Print #free, ftp_buffer_recp
Close #free
status.Text = "Retour f al ok"
FTP_down.Close
ftp_fichier = "base.traca"
cmde_ftp ("DELE ")
End If
End If
Else
status.Text = "Retour ok"
Form1.ffileopen ("C:\fichier duranel" & ftp_fichier)
While fileopen = True
DoEvents
Wend
free = FreeFile
Text3.Text = ftp_buffer_recp
Open "C:\fichier duranel" & ftp_fichier For Output As #free
Print #free, ftp_buffer_recp
Close #free
FTP_down.Close
If modif_prg = False Then
Form1.actualise (1) 'actualise le programme journalier
End If
If ftp_fichier = "prog.po" Then ' enchaine avec le fichier synchro
ftp_fichier = "sync.vie"
cmde_ftp ("RETR ")
Call synchro
End If
End If
End If

End If

If code_reponse = 250 Then
If ftp_fichier = "base.traca" Then
ftp_fichier = "base.al"
cmde_ftp ("DELE ")
End If
If ftp_fichier = "base.al" Then
move_dossier_archive ("\\serveur\Archives\archive_duranel")
marqueur = False
End If
status.Text = "fichier suprimé :" & ftp_fichier
modif_prg = False
End If



If Mid(code_reponse, 1, 1) 5 And code_reponse <> 550 Or Mid(code_reponse, 1, 1) 4 And code_reponse <> 425 Then ' Reponse négative fermeture connection
modif_prg = False

FTP.SendData "ABOR" & vbCrLf
FTP_up.Close
FTP_down.Close

End If

If code_reponse = 425 Then

FTP.SendData "PASV" & vbCrLf

FTP.SendData commande2 & vbCrLf
End If

If code_reponse = 550 Then ' fichier introuvable sur la carte


If ftp_fichier <> "base.traca" And ftp_fichier <> "base.al" Then
MsgBox ("Fichier" & ftp_fichier & " introuvable sur la carte")
modif_prg = False
Else
status.Text = "Pas de f traca dispo"
marqueur = False

End If

FTP.SendData "ABOR"
FTP_up.Close
FTP_down.Close
FTP.Close
FTP.Connect
End If



End Sub

Private Sub FTP_down_Connect()
port_ouvert = True
End Sub

Private Sub FTP_down_DataArrival(ByVal bytesTotal As Long)
Dim datas As String
status.Text = "Téléchargement en cours ..." ' Télécharge le fichier
FTP_down.GetData datas
ftp_buffer_recp = ftp_buffer_recp & datas


End Sub

Private Sub FTP_down_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Dim v As Long

If storeinprogress = False Then
storeinprogress = True
pgb1.Value = 0
pgb1.Max = (bytesRemaining + bytesSent)
End If

v = (pgb1.Max - bytesRemaining)
pgb1.Value = v
Text1.Text = bytesSent
Text2.Text = bytesRemaining
End Sub

Private Sub FTP_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
status.Text = "Erreur"
FTP.Close
status.Text = "connection ..."
FTP.Connect
End Sub

Private Sub FTP_SendComplete()

storeinprogress = False
pgb1.Value = 0
End Sub

Private Sub FTP_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Dim v As Long

If storeinprogress = False Then
storeinprogress = True
pgb1.Value = 0
pgb1.Max = (bytesRemaining + bytesSent)
End If

v = (pgb1.Max - bytesRemaining)
pgb1.Value = v
Text1.Text = bytesSent
Text2.Text = bytesRemaining
End Sub

Private Sub FTP_up_Connect()
FTP_up.SendData ftp_buffer_env & vbCrLf
storeinprogress = False
status.Text = "connection au canal ok"
ip.Text = FTP_up.RemoteHost
port.Text = FTP_up.RemotePort
port_ouvert = True
End Sub

Private Sub FTP_up_SendComplete()

FTP_up.Close
port_ouvert = False
storeinprogress = False
End Sub

Private Sub FTP_up_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Dim v As Long

If storeinprogress = False Then
storeinprogress = True
pgb1.Value = 0
pgb1.Max = bytesRemaining + bytesSent
End If

v = pgb1.Max - bytesRemaining
pgb1.Value = v
Text1.Text = bytesSent
Text2.Text = bytesRemaining

End Sub

Private Sub init_com_Click()
FTP_up.Close
FTP_down.Close
FTP.Close
status.Text = "reconnection ..."
FTP.Connect
End Sub



Private Sub Timer2_Timer()
If marqueur False And modif_prg False And nouv_prg <> 6 And (Left(code_reponse, 1) = 2 Or Left(code_reponse, 1) = 5) And run_com = False Then
Call Command1_Click
End If
End Sub
Private Function synchro()
Dim z As Integer
Dim buff
sync(1) = "0"
sync(2) = Date
sync(3) = Time
For z = 1 To 4
buff = buff + sync(z)
Next z

Open "C:\fichier duranel\sync.vie" For Output As #1
z = 0
While z < 4
z = z + 1

Print #1, sync(z)
Wend
Close #1
ftp_fichier = "sync.vie"
cmde_ftp ("STOR ")
End Function
Private Sub calcul_port(s As String)


Dim p1 As Integer
Dim p2 As Integer
Dim s_port As String
Dim t() As String
Dim adrIP As String
Dim v_port As Long


p1 = InStr(s, "(")
p2 = InStr(s, ")")
status.Text = "calcul port ..."
If p1 And p2 Then
s_port = Mid$(s, p1 + 1, p2 - p1 - 1)
t = Split(s_port, ",")
If UBound(t()) = 5 Then
adrIP = t(0) & "." & t(1) & "." & t(2) & "." & t(3)
v_port = Val(t(4)) * 256 + Val(t(5))
If commande2 = "RETR " Then

FTP_down.Close
FTP_down.RemoteHost = adrIP
FTP_down.RemotePort = v_port
FTP_down.Connect

Else
If commande2 = "STOR " Then
Form1.ffileopen ("C:\fichier duranel" & ftp_fichier)
ff = FreeFile
Open "C:\fichier duranel" & ftp_fichier For Binary As #ff

ftp_buffer_env = String$(LOF(ff), " ")
Get #ff, , ftp_buffer_env
Close #ff
FTP_up.Close
FTP_up.RemoteHost = adrIP
FTP_up.RemotePort = v_port
FTP_up.Connect
End If
End If
End If
End If
FTP.SendData commande2 & ftp_fichier & vbCrLf
If commande2 = "STOR " Then

End If
End Sub
Private Function cmde_ftp(commande As String)

port_ouvert = False

Do While Left(code_reponse, 1) <> 2
Loop

If commande = "STOR " Then

FTP.SendData "PASV" & vbCrLf
FTP.SendData "TYPE I" & vbCrLf
'FTP.SendData commande & ftp_fichier & vbCrLf
End If

If commande = "DELE " Then
FTP.SendData commande & ftp_fichier & vbCrLf
End If

If commande = "RETR " Then
ftp_buffer_recp = ""
FTP.SendData "PASV" & vbCrLf
FTP.SendData "TYPE I" & vbCrLf
' FTP.SendData commande2 & ftp_fichier & vbCrLf
End If
commande2 = commande

End Function
Private Sub move_dossier_archive(vers As String)
Dim fso2, fldr
Dim de As String

On Error GoTo fin
de = "C:\fichier duranel\archive"
Set fso2 = CreateObject("scripting.fileSystemObject")
fso2.copyfolder de, vers
status.Text = "Dossier d'archive copier sur serveur"
ar_date.Text = Now
ar_place.Text = vers
Exit Sub
fin:
MsgBox "chemin de sauvgarde indisponible"
End Sub
Messages postés
4
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
4 janvier 2010

Bjr tout le monde
personne n'a une d'idée ?