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
}
}