Probleme de transfert de fichier via winsock appli Serveur/Clients - VB/VBA/VBS - Programmation
Marsh Posté le 28-09-2007 à 10:19:18
Va falloir que tu nous donnes un peu de code.
Là, à part faire des conjectures à n'en plus finir on ne va pas avancer beaucoup.
Marsh Posté le 28-09-2007 à 10:53:00
côté serveur :
Private Sub tcpserver_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
Nbre_client_current = Nombre_client - serveur.ListClient.ListCount
If Nbre_client_current = 0 Then
For i = 0 To serveur.ListClient.ListCount
If serveur.ListClient.ListCount = 0 Then Exit For
tabligneip = Split(serveur.ListClient.List(i), " " )
If i = serveur.ListClient.ListCount Then Exit For
If tabligneip(0) = TCPserver(0).RemoteHostIP Then GoTo here
Next
Exit Sub
here:
End If
If TCPserver(0).State <> sckClosed Then 'Si la connection n'est pas fermée,
If Index = 0 Then
intMax = intMax + 1
Load TCPserver(intMax)
'TCPserver(intMax).Close 'on la ferme
TCPserver(intMax).LocalPort = 0
c = TCPserver(0).RemoteHostIP
TCPserver(intMax).accept requestID 'On accepte la connection qui arrive
TCPserver(intMax).SendData "Taille" & FileLen(chemin & "\contacts.txt" )
c = TCPserver(0).RemoteHost
End If
End If
End Sub
Coté Client :
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim Data As String 'Variable qui va stoker les données pour creer le fichier
On Error GoTo fin
TCPclient.GetData Data 'Recevoir les données
test_connexion = 0
'*****************************demande d'envoi du fichier contacts.txt***************************
If Left(Data, 6) = "Taille" And cmdenvoyer.Enabled = True And fermer = 0 And mise_en_service = 0 Then 'Si le client envoi la taille du fichier,
cLenTotal = Int(Mid(Data, 7)) 'on l'enregistre
TCPclient.SendData "Go$$" & Description 'On informe que l'on est prêt a recevoir le fichier
Exit Sub
End If
'****************************envoyer un message*****************************************
If Left(Data, 6) = "Taille" And cmdenvoyer.Enabled = False Then
envoi_message = "$P$" & CStr(NUM) & "$P$" & LevelSent & "$P$" & messagesent & "$P$" & Description
TCPclient.SendData envoi_message
Exit Sub
End If
'*****************************demande d'envoi du fichier contacts.txtn lorsque le Client est en marche avant le server***
If Left(Data, 6) = "Taille" Then 'Si le client envoi la taille du fichier,
cLenTotal = Int(Mid(Data, 7)) 'on l'enregistre
TCPclient.SendData "Go$$" & Description 'On informe que l'on est prêt a recevoir le fichier
Exit Sub
End If
If Data = "ACK" Then
Accusée = "ACK"
Journal
Exit Sub
End If
'*****************************Fermeture de Page plus Client *************
If fermer = 1 Then
TCPclient.SendData "Exit$$" & Description
Exit Sub
End If
'*************************réception du fichier contacts******************************
If Left(Data, 6) = "Taille" Then Exit Sub
Open chemin & "\contacts.txt" For Output As #1
Print #1, "";
Close #1
If FileOpen = False Then 'Si le fichier n'as pas encore été ouvert,
Open chemin & "\contacts.txt" For Binary Access Write As #1 'on le fait
FileOpen = True 'Le fichier est maintenant ouvert (Sert pour ne pas l'ouvrir une deuxième fois)
ElseIf FileOpen = True Then 'S'il est déjà ouvert
DoEvents
End If
cAvance = cAvance + Len(Data) 'La progression du téléchargement
Put 1, , Data 'On continu de creer le fichier qui télécharge
fin_transfert = 0
Timerdogserver.Interval = 60000
Timerdogserver.Enabled = True
Label3.Visible = False
Tabl.Visible = True
Close #1 'On ferme le fichier
FileOpen = False 'Le fichier n'est plus ouvert (Pour une éventuelle prochaine connection)
fin:
TCPclient.Close 'On ferme la connection
End Sub
Marsh Posté le 28-09-2007 à 11:02:09
Je ne suis pas très familier des winsock mais il me semble que tu fais beaucoup de choses dans le Data_Arrival du client et notamment des .SendData qui peuvent parasiter la communication.
Je veux dire que ton code est succeptible d'envoyer plusieurs .SendData alors que l'événement Data_Arrival n'est pas encore fini de traiter.
Tu utilises un timer en complément, ça ne simplifie pas le boulot de diagnostic.
Tu as sans doute un problème dans l'enchainement asynchrone des événements winsock et du timer, mais c'est pas évident à voir comme ça.
Marsh Posté le 28-09-2007 à 12:26:04
penses tu que si je transfert par paquets ça résoudrai le probleme ??
Marsh Posté le 28-09-2007 à 14:44:58
Je ne sais pas mais essaie de tracer précisément le parcours de ton code (ajout d'une fonction de log en fichier) pour savoir à quel moment tes événements se déclenchent.
Tu auras peut-être des surprises... et des réponses.
Marsh Posté le 10-10-2007 à 12:30:57
hello encore moi ...
j'ai toujours le même probleme mon fichier ne se tranfert pas totalement
malgré le fait que j'ai ramener à quelque ligne le dataArrival et que j'envoi le fichier par paquets
je sais pas si il y a une taille de buffer à définir quelque part etc...
j'attends vos idées merci d'avance
Marsh Posté le 28-09-2007 à 09:59:34
Bonjour à tous,
j'ai une application Serveur et une cliente que j'ai installé sur 3 machines + serveur (4)
les applis clientes doivent récupérer un fichier de type txt sur le serveur et afficher les infos dans un grid
le probleme c'est que chaque machine ne recoit pas les mêmes quantité de données et pas completement
le fichier à récuperer sur le serveur est de 9ko
une machine recupere que 5ko ,l'autre 4ko et le dernier 2 ko...
je sais pas d'où peut provenir le probleme en mettant des points d'arrêt c'est la bonne taille de fichier qui est envoyé
merci pour votre aide...
---------------
Né de la bêtise des hommes et de la haine du genre ....