2017-03-18 1 views
0

Je ne parviens pas à envoyer et recevoir des fichiers en travaillant avec les sockets en C.c - programmation socket serveur client - l'envoi de fichiers

Disons que j'ai un fichier qui est 2463 octets grand et je veux envoyer du client au serveur mais il n'envoie jamais le fichier entier. Je fais des recherches sur internet depuis un moment mais je n'ai pas trouvé de solution, donc je serais très heureux si quelqu'un pouvait me dire comment faire ce travail.

Voici mon code:

Client:

char buffer[256]; 

bzero(buffer, 256); 

int block_size; 

while(1){ 

block_size = fread(buffer, sizeof(char), sizeof(buffer), fs); // read from the file 

if (block_size == 0){ 

break; 

} 

if (block_size < 0){ 

perror("ERROR: Failed while sending data."); 
exit(EXIT_FAILURE); 

break; 

} 

void *p = buffer; 

while (block_size > 0) { 

int bytes_written = write(clientSocket, buffer, block_size); // send the data to server 

if (bytes_written <= 0) { 

perror("ERROR: Failed while sending data."); 
exit(EXIT_FAILURE); 

} 

block_size -= bytes_written; 
p += bytes_written; 

} 

bzero(buffer, 256); 

} 

Serveur:

bzero(buffer, 256); 

int file_block_size = 0; 

while (1){ 

bzero(buffer, 256); 

file_block_size = read(incoming_socket, buffer,255); // read the data from client 

fwrite(buffer, sizeof(char), file_block_size, fr); // write the data to file 

if (file_block_size == 0 || file_block_size < 256){ 

fwrite(buffer, sizeof(char), file_block_size, fr); 

break; 

} 

} 

Comme je l'ai dit, cela n'envoie jamais l'intégralité du fichier qui est pour exemple 2,463 octets gros, seulement une partie de celui-ci.

Merci d'avance, sera heureux pour toute aide que je peux obtenir.

Répondre

1

Vous devez associer votre lecture à une écriture. Comme dans l'état actuel, votre code client n'enverra que le résultat de votre dernière opération de lecture puisque vous écrasez le contenu de votre tampon à chaque lecture.

Essayez quelque chose comme ça sur le côté client:

char buffer[256]; 
size_t bytes_read = 0; 
ssize_t bytes_written = 0; 
do{ 
    bytes_read = fread(buffer, sizeof(char), sizeof(buffer), fs); 
    if(ferror(fs)) 
    { 
     perror("Error while reading from file."); 
     close(clientSocket); 
     fclose(fs); 
     exit(EXIT_FAILURE); 
    } 
    bytes_written = write(clientSocket, buffer, bytes_read); 
    printf("Write operation status: %s; bytes sent: %d\n", strerror(errno), bytes_written); 
} while(!feof(fs) && bytes_written != -1); 

Et sur le côté serveur que je ferais:

char buffer[256]; 
ssize_t bytes_read = 0; 
while((bytes_read = read(incoming_socket, buffer, sizeof(buffer))) > 0) 
{ 
    printf("%d bytes read\n", bytes_read); 
    fwrite(buffer, sizeof(char), bytes_read, fr); 
    if(ferror(fr)) 
    { 
     perror("Error while writing to file"); 
     close(incoming_socket); 
     fclose(fr); 
     exit(EXIT_FAILURE); 
    } 
} 
if(bytes_read == -1) 
    printf("%s\n", strerror(errno)); 
+0

Il ne fonctionne pas, dois-je apporter quelques modifications au récepteur (serveur) ainsi que? – Daeto

+0

@Daeto S'il vous plaît poster l'intégralité du code, j'ai le sentiment que ce que vous nous avez montré ce n'est pas tout et s'il vous plaît indenter votre code - il est plus facile à lire. – user5159806

+0

Ceci est l'algorithme d'envoi/réception de fichiers, le reste est l'ouverture de fichiers et l'établissement d'une connexion qui fonctionne bien. – Daeto