IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Transfert de JPEG avec Winsock


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut Transfert de JPEG avec Winsock
    Bonjour à tous

    Je sais utiliser le socket Winsock pour transférer des caractères (du texte par exemple) d'un PC vers un autre.
    Maintenant je voudrais transférer une image (fichier MonImage.jpg).
    Là je coince.
    Quelqu'un aurait-il une piste à me conseiller.
    Par avance merci
    MarcVB6

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 437
    Points
    2 106
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 437
    Points : 2 106
    Par défaut
    De quoi est fait un fichier? d'octets, donc il peut suffire de lire le fichier en binaire et d'en transférer les données pour les reconstituer de l'autre côté

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut
    Merci pour votre réponse.
    Ca paraît logique.
    Mais comment fait-on pour lire un fichier en binaire ?
    Je crois que je vais apprendre de nouvelles choses.

  4. #4
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Tu ouvres comment ton fichier en Binary
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "Mon_fichier" For Binary as #1
    Et utiliser les instructions Get , FileLen

    Par contre un fichier .JPG est assez gros. Faudra l'envoyer vers ta cible en plusieurs(?) morceaux

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 437
    Points
    2 106
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 437
    Points : 2 106
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function LitFichier(FileName As String) As String
     Dim hFich As Integer
     Dim Buffer As String
     hFich = FreeFile
     Open FileName For Binary As #hFich
     Buffer = String(LOF(hFich), 0)
     Get #hFich, , Buffer
     Close #hFich
     LitFichier = Buffer
    End Function
    https://www.developpez.net/forums/d7...chier-binaire/

    Après selon la taille de l'image, il faudra peut-être le lire par morceau (le 2nd paramètre de Get permet de définir la position de lecture)

  6. #6
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Voilà un bout de programme qui est une copie d'un truc que j'avais fait pour une découpe par morceaux d'un gros fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim FichierDeTravail As String * 32768
    ' La taille du buffer est de 32768 octets ( je crois que le max est un peu moins de 64000)
     
    I% = FreeFile
    Open NomFichierComplet$ For Binary As #I%
            Do While Not EOF(I%)
                FichierDeTravail = ""
                Get #I%, , FichierDeTravail   '  on lit 32768 octets
    ' On expédie 32768 octets de "FichierDeTravail" à l'utilisateur (programme à faire)
    ' On incrémente un BarGraff (ou un compteur ) pour indiquer que le transfert avance  (programme à faire)
                DoEvents    ' on redonne la main à d'autres taches pour ne pas bloquer le PC
            Loop              'et rebelote tant que l'EOF n'est pas trouvé
    Close I%

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut
    Bonjour,

    Désolé pour le retard de ma réponse.
    A la retraite on ne fait plus ce que l'on veut.
    Un grand merci à vous deux mais surtout à Daudet.
    J'ai utilisé votre bout de code et ça fonctionne bien.
    J'ai pas mal galéré à la réception car j'envoyais avant l'image des caractères texte et aussi après l'image.
    Il fallait bien envoyer le nom du fichier ... et l'emplacement où l'enregistrer.
    Mon erreur a été d'utiliser la même string pour les textes et l'image.
    Évidemment à l'arrivée des textes, c'était ingérable. J'avais des tonnes de blanc (puisque la string était de longueur fixe (StringImage * 32768).
    J'ai donc utilisé une string de longueur variable pour les textes et tout est rentré dans l'ordre.

    J'ai une question subsidiaire pour Daudet:
    Dans mes recherches pour trouver une solution, j'ai utilisé une string variable ( Dim MaString() as String ) pour transférer différents gros fichiers, juste pour voir.
    J'ai réussi à transférer d'un coup une vidéo qui faisait jusqu'à 87 MO.
    Avec une autre de 198 MO, çà plante.
    D'où ma question: Pourquoi déclarer 32768 dans Dim FichierDeTravail As String * 32768 ?
    Ne pourrait-on pas déclarer une valeur plus importante ?
    Sûrement une question bête mais j'ai encore des lacunes sur ce sujet.
    Merci

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 522
    Points
    20 830
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 522
    Points : 20 830
    Par défaut
    Salut Marc, 32768 doit être la taille max.
    Donc il faut passer par des API Windows pour allouer un tampon mémoire comme GlobalAlloc etc....

  9. #9
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    32768 doit être la taille max.
    Pour moi un string VB6 est limité à 64K pour le texte PLUS le descripteur
    Voir la réponse 7 ici : https://www.vbforums.com/showthread....tring-variable
    Comme un cluster de disque dur, c'est généralement 4096 octets, on peut faire un string de lecture de 15x4096=61440 .Perso je pense, que pour faciliter la lecture (et donc le temps de transfert), il vaut mieux demander un multiple de 4096. J'avais utiliser 32768 car mon application, c'était pas des gros gros fichiers
    Donc il faut passer par des API Windows pour allouer un tampon mémoire comme GlobalAlloc etc....
    C'est hors de ma limite de compétence !

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 522
    Points
    20 830
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 522
    Points : 20 830
    Par défaut
    @Daudet : il faut suivre les exemples du MSDN qui sont en C++
    je peux vous aider au besoin

  11. #11
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    @Daudet : il faut suivre les exemples du MSDN qui sont en C++
    je peux vous aider au besoin
    Merci,si ça intéresse MarcVB6 . . .
    Perso, les APIs, c'est un peu nébuleux . . . et à 81 ans, ça va être le brouillard !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut
    Bonjour Mat.M
    Citation Envoyé par Mat.M Voir le message
    Salut Marc, 32768 doit être la taille max.
    Bon, je m'en tiendrai à cela. D'autant que ça fonctionne bien avec l'exemple du code de Daudet78.
    Ce que j'ai compris (j'espère) c'est qu'une String de longueur variable peut contenir +/- 2 milliards de caractères alors qu'une String de longueur fixe est limitée à +/- 64 Ko.
    Mais tout est dans la nuance du "+/-"./
    D'ailleurs je viens de redécouvrir que c'est écrit noir sur blanc dans la MSDN !

    Bonjour Daudet78
    Citation Envoyé par Daudet78 Voir le message
    Perso, les APIs, c'est un peu nébuleux . . . .
    Et pour moi donc.

    Encore un grand merci pour vos réponses et vos aides.
    Je voudrais bien cliquer sur Résolu mais je ne trouve plus le bouton ha doc ?

  13. #13
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Citation Envoyé par MarcVB6 Voir le message
    Et pour moi donc.
    Le problème des APIs, c'est les paramètres à passer (Long, Court, , Bouléen, String avec un 00 au cul etc) et dans quel mode ( en valeur ? en référence ?).
    J'en ai utilisées (avec VB6), à condition d'avoir un tuto qui marche. Je copie, je sauvegarde et je teste. En effet, il n'y a pas de garde fou et, en cas d'erreur, tu plantes VB6 et/ou le PC

    C'est plus performant (en vitesse et en possibilités) qu'une suite de commandes en VB6 . . . mais c'est un tunnel. Tu rentres dedans, le trou noir, tu ne peux rien debbuger :
    • Si c'est presque bon, tu ressors du tunnel. Et peut-être que ça marche !
    • Si c'est pas bon, tu n'as plus qu'a reseter le PC

    Ce n'est que mon avis de débutant

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 437
    Points
    2 106
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 437
    Points : 2 106
    Par défaut
    Il y a un outil (a priori fourni avec VB6 version Pro): la visionneuse d'API qui vient avec des fichiers décrivant les appels aux fonctions d'API Win32; et qui permet d'avoir les bonnes déclarations pour les fonctions de ces API.

    Sinon il y a API-Guide sur http://allapi.mentalis.org/agnet/ (ça date un peu, mais ça peut être utile)

    PS: je n'ai pas encore testé si API-guide fonctionnait bien sous win10

  15. #15
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Citation Envoyé par umfred Voir le message
    ça date un peu, mais ça peut être utile
    Merci Umfred. J'ai pas tout lu encore, mais rien que le début m'explique mes déboires de plantage (VB6 et/ou PC) . Et c'est pour ça que je sauvais systématiquement mon programme VB6 avec API avant de le lancer !

  16. #16
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 522
    Points
    20 830
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 522
    Points : 20 830
    Par défaut
    D'une façon ou d'une autre je ne conseille pas d'envoyer des données > 4096 octets ou 4k c'est pour cela qu'il faut découper le fichier en plusieurs blocs de taille équivalente + le reste du fichier.
    Et puis c'est bien d'envoyer au récepteur le nombre d''octets transmis pour s'assurer de la bonne réception,voire même date,heure du message.

    Donc le protocole pourrait ressembler à ça
    |en tête| taille du tampon | tampon/données du fichier | code de termination du message|

  17. #17
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Points
    1 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Par défaut
    Citation Envoyé par MarcVB6 Voir le message
    Je sais utiliser le socket Winsock pour transférer des caractères
    je ne connais pas Winsock. C'est bi-directionnel ?
    Citation Envoyé par Mat.M Voir le message
    Donc le protocole pourrait ressembler à ça
    |en tête| taille du tampon | tampon/données du fichier | code de termination du message|
    Plutôt : |en tête| N° de trame| taille du tampon | tampon/données du fichier |CRC | code de termination du message|

    Si la réception de la trame est pourrie, le récepteur envoi un "non acquittement" et l'émetteur renvoie la trame.

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 437
    Points
    2 106
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 437
    Points : 2 106
    Par défaut
    au cas où, il y a un exemple simple d'utilisation de winsock pour un transfert de fichier qui peut servir de base http://vb-helper.com/howto_winsock_file_transfer.html

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut
    Bonjour Daudet78,

    Citation Envoyé par DAUDET78 Voir le message
    je ne connais pas Winsock. C'est bi-directionnel ?
    C'est ça : Nom : Winsock.jpg
Affichages : 71
Taille : 1,5 Ko
    C'est le seul truc que je connais sous VB6 pour une communication réseau.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    94
    Points
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 94
    Points : 54
    Par défaut
    Bonjour Umfred,
    Citation Envoyé par umfred Voir le message
    au cas où, il y a un exemple simple d'utilisation de winsock pour un transfert de fichier qui peut servir de base http://vb-helper.com/howto_winsock_file_transfer.html
    C'est intéressant mais, d'après ce que j'ai pu comprendre, lui il limite l'émission à 8192 et pas 32768?. Encore un mystère de plus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB]Envoie de fichier avec winsock
    Par Xdrei dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/03/2006, 10h54
  2. Envoie de 2 variables avec winsock puis traitement
    Par Xdrei dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/03/2006, 11h27
  3. Transfert de fichier avec TServeurSocket et TClientSocket
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/09/2005, 18h53
  4. Envoyer des pieces jointes avec winsock....
    Par YoUpIeN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/01/2005, 01h26
  5. Réponses: 5
    Dernier message: 26/05/2004, 11h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo