Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème à recevoir un pointeur de uchar par TCP  (Lu 2415 fois)

0 Membres et 1 Invité sur ce sujet

james08m

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Problème à recevoir un pointeur de uchar par TCP
« le: Février 11, 2015, 09:12:35 pm »
Bonjour, je travail sur un petit programme en C++ avec opencv et SFML 2.2 pour envoyer une image dans un  *uchar (cv::Mat::data dans opencv) vers un autre ordinateur, mais j'ai quelque problème. En premier lieu, le programme client prend un photo et puis l'envoi par tcp vers un programme serveur, mais le problème est que le serveur ne reçoit pas toutes les données envoyés et je récupère donc qu'une petite partit de l'image (le haut de l'image).

J'ai aussi essayer de changer les socket pour non bloquant, mais sans succès et je suis déjà certain que le frame envoyé est complet. Je crois bien avoir passé le bon size en paramètre quand je reçoit côté serveur, donc je ne sais pas pourquoi je ne reçoit pas tout l'image.

Hypothèse de ma part : Je crois peut être qu'envoyer mon *uchar par paquet serait la solution, mais je ne sais pas comment bien surcharger les opérateurs >> et <<. Surtout que je suis un peux mélangeur la dans la structure du *uchar...

Voici le code :

Client :
        Mat frame = Camera.getVectFrame(9); // Get a frame
        int imgSize = frame.total()*frame.elemSize();

        sf::TcpSocket socket;
        sf::Socket::Status status = socket.connect("127.0.0.1", 69000);
        if (status != sf::Socket::Done)
        {
                cout << "ERROR : Not connected" << endl;
        }
        else
        {
                cout << "Connected" << endl;

                // Send data
                if (socket.send(frame.data,imgSize) != sf::Socket::Done)
                {
                        cout << "ERROR : Fail to send" << endl;
                }
                else
                {
                        cout << "Sended : " << imgSize << endl;
                }

        }
 

Serveur :
        sf::TcpListener listener;

        // Listen to port 69000
        if (listener.listen(69000) != sf::Socket::Done)
        {
                cout << "ERROR : Can't listen to port" << endl;
        }
        else
        {
                // Wait for client
                sf::TcpSocket client;
                if (listener.accept(client) != sf::Socket::Done)
                {
                        cout << "ERROR : Client can't connect" << endl;
                }
                else
                {
                        cout << "Client connected" << endl;

                        // Receive data from socket
                        Mat  img = Mat::zeros(480, 640, CV_8UC3);
                        const int size = 921600;
                        size_t received;


                        if (client.receive(img.data, size, received) != sf::Socket::Done)
                        {
                                cout << "ERROR : Can't receive data" << endl;
                        }
                        else
                        {
                                cout << "Received : " << received << endl;

                                imwrite("received.jpg", img); // Save as jpg file
                        }
                }
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème à recevoir un pointeur de uchar par TCP
« Réponse #1 le: Février 11, 2015, 10:20:45 pm »
Quel OS ? Tu reçois combien d'octets sur combien au total ?
Laurent Gomila - SFML developer

james08m

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème à recevoir un pointeur de uchar par TCP
« Réponse #2 le: Février 11, 2015, 10:26:50 pm »
Je suis sur windows 10 technical preview (Ne parter pas en peur je doute que mon OS sois le problème à ce point)
et je reçoit 195640 octets sur les 921600 (en gros 640*480*3 car l'image est 640x480)

james08m

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème à recevoir un pointeur de uchar par TCP
« Réponse #3 le: Février 12, 2015, 12:33:53 am »
Topic à fermer j'ai résolu mon problèmes avec les packets.

Mon code :

Client :
                sf::Packet packet;

                for (int i = 0; i < 921600; i++)
                {
                        packet << frame.data[i];
                }



                // Send data
                if (socket.send(packet) != sf::Socket::Done)
                {
                        cout << "ERROR : Fail to send" << endl;
                }
                else
                {
                        cout << "Sended : " << imgSize << endl;
                }
 

Serveur :
                        Mat  frame = Mat::zeros(480, 640, CV_8UC3);
                        const int size = 921600;

                        sf::Packet packet;
                        if (client.receive(packet) != sf::Socket::Done)
                        {
                                cout << "ERROR : Can't receive data" << endl;
                        }
                        else
                        {
                                // Extract packet into img.data
                                for (int i = 0; i < 921600; i++)
                                {
                                        packet >> frame.data[i];
                                }

                                // Save as .jpg
                                imwrite("received.jpg", frame);
                        }
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème à recevoir un pointeur de uchar par TCP
« Réponse #4 le: Février 12, 2015, 07:52:53 am »
Ouch... Utilise plutôt Packet::append et Packet::getData / Packet::getDataLength.
Laurent Gomila - SFML developer