probleme avec l'envoi d'un fichier avec les socket
salut les amis
je viens de commencer avec les socket et je veux savoir comment transferer un fichier (un gif dans mon ex)
cote serveur :
Code:
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
| #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#define TAILLE_MAX 1024
int main() {
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
struct sockaddr_in addr1,addr2 ;
char chaine[TAILLE_MAX] , T[TAILLE_MAX];
FILE *fichier = fopen("server.gif","r");
if(fichier == NULL){
printf("Error avec le fichier\n");
getch();
exit(1);
}
int Id1 = socket(AF_INET,SOCK_STREAM,0) ;
addr1.sin_family = AF_INET ;
addr1.sin_port = htons(1500) ;
addr1.sin_addr.s_addr = htonl(INADDR_ANY) ;//inet_addr("127.0.0.1") ;
if( bind( Id1,(struct sockaddr *)&addr1,sizeof(addr1) ) == -1 ){
printf("Bind Error\n") ;
getch();
exit(1);
}
listen(Id1,10);
printf("En attente de connexion...\n");
int len1 = sizeof addr2 ;
int Id2 = accept( Id1 , (struct sockaddr *) (&addr2) , &len1 ) ;
printf("Machine connected !!\nIP : %s\tID : %d\n",inet_ntoa(addr2.sin_addr),Id2);
while(fgets(chaine, TAILLE_MAX, fichier) != NULL){
printf("%d Octets send\n",send(Id2 , chaine , strlen(chaine) , 0));
}
close(Id1);
close(Id1);
fclose(fichier);
WSACleanup();
getch();
} |
cote client :
Code:
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
| #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#define TAILLE_MAX 1024
int main() {
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
FILE *fichier = NULL ;
struct sockaddr_in addr1,addr2 ;
int n;
char T[TAILLE_MAX];
int ID1 = socket(AF_INET,SOCK_STREAM,0) ;
addr1.sin_family = AF_INET ;
addr1.sin_port = htons(1500) ;
addr1.sin_addr.s_addr = inet_addr("127.0.0.1") ;
if( connect( ID1,(struct sockaddr *)&addr1,sizeof addr1 ) < 0 ){
printf("Connect Error\n") ;
getch();
exit(1);
}
printf("Connect to server !!\n");
if( (fichier=fopen("client.gif","w")) == NULL ){
printf("Error avec le fichier\n");
getch();
exit(1);
}
while( (n=recv( ID1 , T , TAILLE_MAX-1 , 0)) > 0 ){
T[n]='\0' ;
fputs(T, fichier);
printf("%d octets recv\n",n);
}
close(ID1);
fclose(fichier);
WSACleanup();
getch();
} |
voila le resultat
du serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| En attente de connexion...
Machine connected !!
IP : 127.0.0.1 ID : 140
7 Octets send
51 Octets send
93 Octets send
18 Octets send
153 Octets send
19 Octets send
51 Octets send
93 Octets send
18 Octets send |
(7 +51 +93 +18 +153 +19 +51 +93 +18 = 503 )
du client :
Code:
1 2
| Connect to server !!
503 octets recv |
mais en resultat le fichier client.gif n'est pas vraiment une image
sa taille est 508 octets alors que la vrai image a 870 octets
et parfois j'obtien en resulat 0 octets
Code:
Connect to server !!
et d'autre fois
Code:
1 2 3
| Connect to server !!
485 octets recv
18 octets recv |
alors quelle est le probleme ?