salut,
Comment transmettre des données binaire (type mp3 ou video) entre PC à l'aide des sockets c?
Je sais le faire avec du texte (send...)mais pas avec le binaire.
merci de vos éventuels réponses
salut,
Comment transmettre des données binaire (type mp3 ou video) entre PC à l'aide des sockets c?
Je sais le faire avec du texte (send...)mais pas avec le binaire.
merci de vos éventuels réponses
Bonjour,
send() ne fait aucune distinction entre les fichiers texte en particulier et les fichiers binaire en général. L'appel reçoit en argument un pointeur vers les données à envoyer et la longueur de ces données.
À toi d'envoyer le contenu de ton fichier de la même façon, en le fragmentant éventuellement.
j'a réussi a envoye un fichier binaire ,mais je dois découper le fichier en morceau de 4 octets sinon il est corrompu à l'arrivé
voici le code de ma fonction téléchergement et upload
coté serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 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; }
coté client la fonction telechargement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 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; }
"sizeof(buffer)" n'est pas la taille du buffer ; c'est la taille d'un pointeur vers un char (probablement 4 octets sur ton architecture, ce qui explique tu tu ne peux pas lire plus de 4 octets à la fois côté client). Ce que tu veux c'est lire et envoyer "buff" octets (le nom de la variable est mal choisi, d'ailleurs).
Petite remarque qui n'est pas en rapport avec ton problème technique:
Soit pertinent et cohérent dans tes noms de méthodes et de variables.
Ici, tu appelles la fonction qui envoie "upload", ce qui est le terme en anglais, et ta fonction de téléchargement "telechargement", ce qui est le terme français.
Il y a des fautes, au niveau de la langue française, dans tes noms de variable, par exemple "int octet_envoye;" auquel il manque un "s". C'est important, car sinon on peut comprendre que cela veut dire "l'octet que j'ai envoyé". Or, cela correspond au nombre d'octetS que tu as envoyé, ce qui n'est pas pareil.
Des bons noms de méthodes et variables sont essentiels pour que ton code soit lisible et compréhensible. Si tu le relis dans 6 mois, ou pire, si tu le lègue à quelqu'un d'autre, des mauvais noms vont augmenter le temps nécessaire pour reprendre ton code, à cause du temps de compréhension.
Il y a des gens qui pensent que tout doit être codé en Anglais, je suis de ce camp là, mais c'est encore un autre débat.
Si vous moinsez, merci de répondre pour argumenter!
Ma présentation
Partager