Probleme de transfert de fichier via winsock appli Serveur/Clients

Probleme de transfert de fichier via winsock appli Serveur/Clients - VB/VBA/VBS - Programmation

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 ....
Reply

Marsh Posté le 28-09-2007 à 09:59:34   

Reply

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.

Reply

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

Reply

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.

Reply

Marsh Posté le 28-09-2007 à 12:26:04    

penses tu que si je transfert par paquets ça résoudrai le probleme ??

Reply

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.


Message édité par tegu le 28-09-2007 à 14:45:10
Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed