int envoi_fichier(SOCKET sur_socket, char* fichier) { FILE *p_fichier; p_fichier = fopen(fichier, "rb"); if (p_fichier == NULL) return 0; puts("\n\touverture fichier source"); int longueur = 0; while (!feof(p_fichier)) { fgetc(p_fichier); longueur++; } fclose(p_fichier); printf("\n\ttaille fichier: %d", longueur); unsigned char* contenu_fichier; contenu_fichier = malloc(longueur*sizeof(char)); puts("\n\tinitialisation conteneur"); int i; for(i=0; i<longueur+1; i++) contenu_fichier[i]= '\0'; p_fichier = fopen(fichier, "rb"); if (p_fichier == NULL) return 0; i=0; while (!feof(p_fichier)) { contenu_fichier[i] = fgetc(p_fichier); i++; } fclose(p_fichier); char t_donnees_a_envoyer[10] = {0}; sprintf(t_donnees_a_envoyer, "%d", longueur); if(send(sur_socket, t_donnees_a_envoyer, strlen(t_donnees_a_envoyer), 0) == SOCKET_ERROR) return 0; if(send(sur_socket, &t_donnees_a_envoyer[strlen(t_donnees_a_envoyer)+1], 1, 0) == SOCKET_ERROR) return 0; if(send(sur_socket, contenu_fichier, longueur ,0) == SOCKET_ERROR) return 0; free(contenu_fichier); return 1; }
Merci encore
si vous avez des remarques pour l'améliorer
#include <sys/types.h> #include <sys/socket.h> #include <sys/mman.h> #include <sys/stat.h> #include #include <stdio.h> #include <fcntl.h> int send_file(int so, const char *file) { struct stat st; int fd; int nbw; char *addr; fd = open(file, O_RDONLY); if (fd == -1) { perror("open"); return -1; } fstat(fd, &st); addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (addr == MAP_FAILED) { perror("mmap"); return -1; } nbw = send(so, addr, st.st_size, 0); if (nbw != st.st_size) { perror("send"); munmap(addr, st.st_size); return -1; } return munmap(addr, st.st_size); }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question/* ... */ addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); if (addr == MAP_FAILED) /* ... */
en attendant ça consiste en quoi "mapper le fichier en mémoire"