Transfert gros fichier binaire socket c

Fermé
yosh123 Messages postés 1 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 21 janvier 2011 - 21 janv. 2011 à 12:39
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 21 janv. 2011 à 14:03
Bonjour,


j'ai réussi a transférer des gros fichiers binaire a travers les socket c mais malheureusement la taille du buffer que je met dans le buffer de recv et de send ne doit pas dépasse 4 octets sinon le fichier est corrompus lors du transfert

voici le code ma fonction upload coté serveur

int upload(const char* fichier,int socket,int buff)
	{
FILE *fs;
int octet_envoye;
int taille_fichier;
unsigned char *buffer;

		fs = fopen(fichier, "rb");
int deplacement=50;
    fseek(fs, 0, SEEK_END);
    taille_fichier =  ftell(fs);
    buffer = malloc(buff);
    fseek(fs, 0, SEEK_SET);
    int octet_total=0;
 int taille_temporaire=ftell(fs);

while  (taille_temporaire!=taille_fichier)
   {
    fread(buffer,sizeof(char),buff,fs);
	octet_envoye=send(socket, buffer, sizeof(buffer), 0);
	
	if(octet_envoye<0)
	{
		perror("erreur de send");
		return 1;
	}
	printf("le nombre d'octet envoyé est %d\n",octet_envoye);
	
	taille_temporaire=ftell(fs);
	octet_total+=octet_envoye;
	printf("nombre total d'octet envoye est %d \n",octet_total);
     printf("voici la taille temporaire est %d\n",taille_temporaire);
     printf("le nombre d'octet envoyé est %d\n",octet_envoye);
	
}   
   
	return 0;
} 



voici le code de ma fonction téléchargement coté client
int telechargement(const char *fichier,int socket,int buff)
	{
		 FILE* fd;
unsigned char *buffer;
buffer=malloc(buff);
fd=fopen(fichier,"ab");
int octet_recu=0;

int taille_fichier=65115;
fseek(fd, 0, SEEK_SET);
 int taille_temporaire=ftell(fd);
 taille_temporaire=0;
while(taille_temporaire<=taille_fichier)
{
octet_recu=recv(socket, buffer, sizeof(buffer), 0);
if(octet_recu<0)
{
	perror("erreur recv");
}
printf("le nombre d'octet reçu est %d\n",octet_recu);
fwrite(buffer,sizeof(char),buff,fd);
taille_temporaire=ftell(fd);
printf("la taille temporaire est %d \n",taille_temporaire);
}
 fclose(fd);
 return 0;
}



merci
A voir également:

1 réponse

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
21 janv. 2011 à 14:03
Salut
je suppose que c'est sous Windows que tu fait ça ? Sous win, il considère ce que tu transmet comme des caractère et tronque certaine donnée (caractères nuls ou retour à la ligne). Et ça peut arriver dans un fichier binaire.
Pour éviter ça, tu peux essayer d'utiliser read et write http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/read.2.html (le descripteur de fichier, c'est le socket). Avec ves fonctions, tu dois même pouvoir faire de plus gros buffers.
0