2011-03-16 5 views
0

J'écris un serveur web très simple dans c (winsock2).comment envoyer une image dans winsock2, en utilisant c

Je suis capable de retourner le contenu de mes pages html.

Actuellement, ce que je fais est écrit le contenu d'un fichier dans un char * tampon et l'envoyer à l'aide « envoyer() »

Bien que lorsque je tente de lire une image (jpg, bmp), je Impossible d'écrire les caractères dans un tampon. Certains caractères sont "Null" (0).

Comment envoyer un fichier image entier?

Merci.

Répondre

1

Vous pouvez stocker le caractère nul dans un tampon char*. Il suffit d'utiliser un compteur pour se rappeler combien de caractères ont été écrits, au lieu de le recalculer en comptant le nombre de caractères non nuls (cela peut être un entier ou un pointeur vers le point d'insertion suivant dans le tampon).

Pour envoyer un fichier, vous allez faire quelque chose comme ça:

int sendFile(int sock, const char* filename) { 
    FILE* file = fopen(filename, "rb"); 
    if (file == NULL) 
     return -1; 

    if (fseek(file, 0, SEEK_END) != 0) { 
     fclose(file); 
     return -1; 
    } 

    off_t size = ftello(file); 
    if (fseek(file, 0, SEEK_SET) != 0) { 
     fclose(file); 
     return -1; 
    } 

    if (SendBinaryFileHeaderAndSize(sock, size) < 0) { 
     fclose(file); 
     return -1; 
    } 

    char buffer[4096]; 
    for (;;) { 
     size_t read = fread(buffer, 1, sizeof(buffer), file); 
     if (read == 0) { 
      int retcode = 0; 
      if (ferror(file)) 
       retcode = -1; 
      fclose(file); 
      return retcode; 
     } 

     for (size_t sent = 0; sent < read;) { 
      int ret = send(sock, buffer + sent, read - sent, 0); 
      if (ret < 0) { 
       fclose(file); 
       return -1; 
      } 

      assert(ret <= read - sent); 
      sent += ret; 
     } 
    } 
} 
+0

comment puis-je connaître la taille de l'imagefile dans c? et une fois que je sais que je peux utiliser fgetc pour aller chercher le contenu de l'image? aussi, je pense que j'ai la taille de fseek. mais quand j'ouvre l'image dans le navigateur, le navigateur est juste une page vide. il n'y a rien dedans. –

+1

Vous pouvez utiliser 'fseek (fichier, O, SEEK_END)', ou un code spécifique à la plate-forme ('lstat',' GetFileInformationByHandle', ...), pour obtenir la taille du fichier. Vous devez également vérifier que vous envoyez l'en-tête correct (taille, type de contenu, ...) à votre client en suivant le protocole HTTP (vous pouvez utiliser un autre serveur web pour vérifier ce qu'il envoie lorsque vous essayez d'accéder à un fichier binaire) . –

+0

Je semble capable de lire le fichier. Bien que quand je l'ouvre. Je suis capable de télécharger le fichier, mais il est dit corrompu. Est-ce que fgetc retourne un caractère signé? Et winsock.send permet-il de transmettre des caractères non signés? –

0

Selon la façon dont vous chargez l'image dans votre serveur Web, vous devez utiliser soit Winsock:TransmitPackets ou Winsock:TransmitFile, également envelopper aussi l'image dans les en-têtes HTTP appropriées

Notez que ce sont des extensions spécifiques MS.

Voir aussi c++ - Bitmap transfer using winsock getdibits and setdibits

+0

pourriez-vous me donner un exemple de code pour TransmitPackets J'utilise WindowsXP. Je ne connais pas très bien c. –

+0

Je vous suggère de lire sur tout à http://msdn.microsoft.com/en-us/library/ms740632(v=VS.85).aspx –

+0

J'ai lu la plupart de celui-ci. Impossible de trouver beaucoup sur la transmission de fichiers. –

1

Vous devez comprendre comment envoyer() et le travail de fread(). Les 0 dans le tampon ne sont pas un problème pour send ou fread - ils n'interprètent pas leurs tampons comme des chaînes à terminaison nulle.

Questions connexes