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

Qt Discussion :

[TCP]Transfert d'image par le réseau


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut [TCP]Transfert d'image par le réseau
    PLUS A JOUR, MERCI DE LIRE LE DERNIER POST


    Bonsoir à tous,

    Je souhaiterais transférer une image d'un poste à l'autre via une connexion UDP.

    Je pense que je m'embrouille quelque part, et que je perd l'image en route...

    J'ai joint les fichiers au post.

    L'erreur est:

    Initializing Udp socket... Done
    Reading datagrams
    Corrupt JPEG data: 1 extraneous bytes before marker 0xd9

    Donc soit je lis mal l'image (Server.cpp et Server.h), soit elle n'est pas correctement envoyée (Client.cpp et Client.h)...

    Comment je peux résoudre ce problème? Vérifier au moins que l'image est bien envoyée par le client?

    Merci d'avance et bonne soirée
    Seeme.

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    quelques remarques :

    1/ UDP est un protocole de transmission de données via le réseau où la transmission des datagrammes n'est pas garantie.
    En d'autres termes, si une erreur se glisse dans un des paquets de données pendant la transmission, il sera soit délivré avec l'erreur, soit purement et simplement 'oublié'.
    Même problématique sur l'ordre des paquets: UDP ne garantit pas que les paquets de données seront reçus dans l'ordre dans lequel ils ont été émis.

    Ce type de transmission n'est pas du tout adapté à la transmission de données dont on doit garantir l'intégrité (un fichier d'image en fait partie).
    Il te faudra donc te tourner vers un protocole garantissant leur intégrité.
    Typiquement, tourne-toi du côté du protocole TCP.

    2/ le peu que j'ai vu ton code montre que:

    - tu ne gères pas la découpe de la totalité des données envoyées en plusieurs sous-paquets. Or la taille des datagrammes UDP est limitée par UDP lui-même ainsi que chaque couche réseau 'en dessous' d'UDP.

    - tu utilises les sockets Qt sans avoir réellement lancé une application et sa boucle d'événements associée [ie. lancer qApp.exec()]. Or je sais qu'aun moins pour les sockets TCP, la boucle d'événements est utilisée.

    Bref, je te conseille très vivement de jeter un oeil du côté des exemples d'utilisation des socket TCP fournis avec Qt et de revoir complètement ton code.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Salut, merci pour la réponse

    Je pensais que pour privilégier la vitesse (quite à perdre des infos), UDP collait bien à ce que je voulais faire.. Je pensais que quelques erreurs n'auraient par été catastrophiques (j'attendais au pire quelques artefactes sur l'image)...

    Je prend les même et je recommence en TCP.

    Merci

  4. #4
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Bon, j'ai tout repris à zéro, et je pense que ça marche déjà mieux...

    J'utilise donc du TCP pour transférer une image au client...

    Voilà la fonction d'envoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void Server::incomingConnection(int sockfd){
    				std::cout<<"Incomming connection"<<std::endl;
     
    				//Chargement image
    				QPixmap image("img.jpg");
    				QByteArray array;
    				QBuffer buffer(&array);
    				buffer.open(QIODevice::WriteOnly);
    				image.save(&buffer, "JPG");
     
     
    				QTcpSocket socket;
    				if(!socket.setSocketDescriptor(sockfd)){
    								std::cout<<"Error!"<<std::endl;
    								return;
    				}
    				QByteArray block;
    				QDataStream out(&block, QIODevice::WriteOnly);
    				out.setVersion(QDataStream::Qt_4_0);
    				out << (quint16)0;
    				out << buffer.data();
    //				out << "PLop";
    				out.device()->seek(0);
    				out << (quint16)(block.size() - sizeof(quint16));
     
    				socket.write(block);
    				socket.disconnectFromHost();
    				socket.waitForDisconnected();
    }
    Et celle qui réceptionne (la connection à l'air de bien se faire...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void Client::readData(){
    				tcpSocket->abort();
    				tcpSocket->connectToHost("127.0.0.1", 1337);
    				blockSize = 0;
     
    				QDataStream in(tcpSocket);
    				in.setVersion(QDataStream::Qt_4_0);
     
     
    				if (blockSize == 0) {
    								if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
    //												return;
     
    								in >> blockSize;
    				}
     
    				if (tcpSocket->bytesAvailable() < blockSize)
    								return;
     
    				std::cout<<"ICI!!"<<tcpSocket->bytesAvailable()<<std::endl;
    //				in >> image;
    //				std::cout<<image.size().width()<<std::endl;
    //				std::cout<<image.size().height()<<std::endl;
    				in >> msg;
    				tcpSocket->disconnectFromHost();
    }
    Je me suis largement inspiré du tuto de la doc Qt...

    Quand je me connecte avec telnet, la conection se fait et je reçois un tas de caractères non imprimables (ce qui me ferais dire que l'image est bien envoyée..)

    Mais si je me connecte avec mon client, il ne reçois jamais rien... Je pense que ça vient de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (blockSize == 0) {
    								if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
    												return;
     
    								in >> blockSize;
    				}
    bytesAvailable vaut toujours 0.. et je pense que ce que j'envoie est juste trop gros... (cf post précédent), faut-il que je découpe mes données (l'objectif est d'envoyer les images capturées avec une webcam)?


    Merci d'avance..
    Seeme

Discussions similaires

  1. Transfert d'image en TCP pendant un jeu en réseaux
    Par benjahwest dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2012, 17h05
  2. [MySQL] Transfert image par formulaire PHP
    Par fasyr dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/11/2008, 19h20
  3. transfert BD entre 2 serveur SQL mais sans passer par le réseau
    Par TangoZoulou dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2007, 14h30
  4. Transfert d'une image par socket stream
    Par francky23012301 dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 16h06
  5. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53

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