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;
}
}
}
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. –
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) . –
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? –