1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| // Codes d'opérations.
typedef enum {
opFilename = 0, // Prochaine donnée : nom du fichier.
opFilesize, // Prochaine donnée : taille du fichier.
opFiledata, // Prochaine donnée : contenu du fichier.
opEnd // Fin du protocole, on arrête le client. Pas de données à la suite.
} COpcodes ;
// Entête du protocole.
typedef struct {
int Opcode ; // Code de l'opération.
int DataSize ; // Taille des données qui vont suivre.
} CHeader ;
int main ( void ) {
....
// Code d'émission.
CHeader hdr ;
char* filename = "........" ;
unsigned long int filesize = .......... ;
char buffer[BUFSIZ] ;
ssize_t rd ;
hdr.Opcode = opFilename ;
hdr.DataSize = strlen(filename);
send(sock,&hdr,sizeof(hdr),0);
send(sock,filename,strlen(filename),0);
hdr.Opcode = opFileSize ;
hdr.DataSize = sizeof(filesize);
send(sock,&hdr,sizeof(hdr),0);
send(sock,&filesize,strlen(filesize),0);
hdr.Opcode = opFiledata ;
hdr.DataSize = filesize ;
send(sock,&hdr,sizeof(hdr),0);
// Boucle d'envoi du fichier, "filesize" octets.
for (unsigned long int k = filesize ; k >0 ; ) {
// On lit ce qui va bien : soit la taille maximale du buffer, soit ce qu'il reste à lire.
rd = read(file,buffer,min(BUFSIZ,k)) ;
// Si l'on a lu des données, on les envoie.
if (rd>0) {
send(sock,buffer,rd);
// Et on met à jour la taille restante.
k -=rd ;
}
}
....
return 0 ;
} |
Partager