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 : 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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
et d'autre fois
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Connect to server !!
485 octets recv
18 octets recv
alors quelle est le probleme ?