title: Send binary file in HTTP response using C sockets
body: <p>I`m trying to send a binary file (png image) in http response.</p>
  
  <pre><code>FILE *file;
  char *buffer;
  int fileLen;
  
  //Open file
  file = fopen("1.png", "rb");
  if (!file)
  {
      return;
  }
  
  //Get file length
  fseek(file, 0, SEEK_END);
  fileLen=ftell(file);
  fseek(file, 0, SEEK_SET);
  
  //Allocate memory
  buffer=(char *)malloc(fileLen+1);
  if (!buffer)
  {
      fprintf(stderr, "Memory error!");
      fclose(file);
      return;
  }
  
  //Read file contents into buffer
  fread(buffer, fileLen, 1, file);
  fclose(file);
  //free(buffer);
  
  
  
  
  char header[102400];
  
  sprintf(header, 
  "HTTP/1.1 200 OK\n"
  "Date: Thu, 19 Feb 2009 12:27:04 GMT\n"
  "Server: Apache/2.2.3\n"
  "Last-Modified: Wed, 18 Jun 2003 16:05:58 GMT\n"
  "ETag: \"56d-9989200-1132c580\"\n"
  "Content-Type: image/png\n"
  "Content-Length: %i\n"
  "Accept-Ranges: bytes\n"
  "Connection: close\n"
          "\n", fileLen);
  
  char *reply = (char*)malloc(strlen(header)+fileLen);
  strcpy(reply, header);
  strcat(reply, buffer);
  
  printf("msg %s\n", reply);
  
  
  //return 0;
  int sd = socket(PF_INET, SOCK_STREAM, 0);
  
  struct sockaddr_in addr;
  bzero(&amp;addr, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(8081);
  addr.sin_addr.s_addr = INADDR_ANY;
  
  if(bind(sd,&amp;addr,sizeof(addr))!=0)
  {
      printf("bind error\n");
  }
  
  if (listen(sd, 16)!=0)
  {
      printf("listen error\n");
  }
  
  for(;;)
  {
      int size = sizeof(addr);
      int client = accept(sd, &amp;addr, &amp;size);
  
      if (client &gt; 0)
      {
          printf("client connected\n");
          send(client, reply, strlen(reply), 0);
      }
  }
  </code></pre>
  
  <p>but my browser does not understand this =( What am I doing wrong exactly?</p>
  
  <p>UPD: I tried to send text data - its OK. But binary data fails</p>