title: C++ OpenCV image sending through socket
body: <p>I'm trying to implement a streaming service using OpenCV and sockets. The server side loads a given image and sends it to the client, which receives it through the socket and displays it. I'm having a lot of trouble, though, sending the data of the image and reconstructing it on the client side. This is the code I've made so far:</p>
  
  <p>Image sender:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;netdb.h&gt; 
  #include &lt;opencv2/core/core.hpp&gt;
  #include &lt;opencv2/highgui/highgui.hpp&gt;
  #include &lt;iostream&gt;
  
  using namespace cv;
  using namespace std;
  
  void error(const char *msg)
  {
      perror(msg);
      exit(0);
  }
  
  int main(int argc, char *argv[])
  {
      int sockfd, portno, n;
      struct sockaddr_in serv_addr;
      struct hostent *server;
  
      char buffer[256];
      if (argc &lt; 3) {
         fprintf(stderr,"usage %s hostname port\n", argv[0]);
         exit(0);
      }
      portno = atoi(argv[2]);
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd &lt; 0) 
          error("ERROR opening socket");
      server = gethostbyname(argv[1]);
      if (server == NULL) {
          fprintf(stderr,"ERROR, no such host\n");
          exit(0);
      }
      bzero((char *) &amp;serv_addr, sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      bcopy((char *)server-&gt;h_addr, 
           (char *)&amp;serv_addr.sin_addr.s_addr,
           server-&gt;h_length);
      serv_addr.sin_port = htons(portno);
      if (connect(sockfd,(struct sockaddr *) &amp;serv_addr,sizeof(serv_addr)) &lt; 0) 
          error("ERROR connecting");
  
      Mat image;
      image = imread(argv[3], CV_LOAD_IMAGE_COLOR);
      if(! image.data )                              // Check for invalid input
      {
          cout &lt;&lt;  "Could not open or find the image" &lt;&lt; std::endl ;
          return -1;
      }
  
      n = write(sockfd,image.data,image.total()*image.channels());
      if (n &lt; 0) 
           error("ERROR writing to socket");
      close(sockfd);
  
      namedWindow( "Client", CV_WINDOW_AUTOSIZE );// Create a window for display.
      imshow( "Client", image );  
      waitKey(0);
      return 0;
  }
  </code></pre>
  
  <p>Image receiver:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;netdb.h&gt; 
  #include &lt;opencv2/core/core.hpp&gt;
  #include &lt;opencv2/highgui/highgui.hpp&gt;
  #include &lt;iostream&gt;
  
  using namespace cv;
  using namespace std;
  
  void error(const char *msg)
  {
      perror(msg);
      exit(1);
  }
  
  int main(int argc, char *argv[])
  {
       int sockfd, newsockfd, portno;
       socklen_t clilen;
       char buffer[1024];
       struct sockaddr_in serv_addr, cli_addr;
       int n;
       if (argc &lt; 2) {
           fprintf(stderr,"ERROR, no port provided\n");
           exit(1);
       }
       sockfd = socket(AF_INET, SOCK_STREAM, 0);
       if (sockfd &lt; 0) 
          error("ERROR opening socket");
       bzero((char *) &amp;serv_addr, sizeof(serv_addr));
       portno = atoi(argv[1]);
       serv_addr.sin_family = AF_INET;
       serv_addr.sin_addr.s_addr = INADDR_ANY;
       serv_addr.sin_port = htons(portno);
       if (bind(sockfd, (struct sockaddr *) &amp;serv_addr,
                sizeof(serv_addr)) &lt; 0) 
                error("ERROR on binding");
       listen(sockfd,5);
       clilen = sizeof(cli_addr);
       newsockfd = accept(sockfd, 
                   (struct sockaddr *) &amp;cli_addr, 
                   &amp;clilen);
       if (newsockfd &lt; 0) 
            error("ERROR on accept");
       bzero(buffer,1024);
  
       n = read(newsockfd,buffer,1023);
       if (n &lt; 0) error("ERROR reading from socket");
  
       Mat image(690,690,CV_8UC3,*buffer);
       imwrite("/home/securitas/images/prova.jpg",image);
       close(newsockfd);
       close(sockfd);
  
       namedWindow( "Server", CV_WINDOW_AUTOSIZE );// Create a window for display.
       imshow( "Server", image );  
       waitKey(0);
       return 0; 
  }
  </code></pre>
  
  <p>Al I receive on the client side is a black image, nothing else. Any help?</p>