Erreur dans code client-serveur

Erreur dans code client-serveur - C - Programmation

Marsh Posté le 13-10-2005 à 09:01:04    

Bonjour je doit faire un petit programme de transmission de fichier en c par socket sous linux, et j'ai des erreur de compilation et je n'en trouve pas la source, pourriez vous m'aider.
 
Merci
 
 

Code :
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <fcntl.h>
  7. #define PORT 2806
  8. char choix()
  9. {
  10. char car;
  11. car = getchar();
  12. while(getchar() != '\n');
  13. return(car);
  14. }
  15. main(argc,argv)
  16. int argc;
  17. char *argv[];
  18. {
  19. struct hostent *host;
  20. struct sockaddr_in nom;
  21. char buff;
  22. int sd,acc;
  23. int fd;
  24. int lg;
  25. char nom_serveur[15];
  26. char car;
  27. car = ' ';
  28. /*obtent°socket*/
  29. sd=socket(AF_INET,SOCK_STREAM,0);
  30. if(sd == -1)
  31.  {
  32.  printf("appel a socket refuse\n" );
  33.  exit(0);
  34.  }
  35. bzero((char*)&nom, sizeof(nom));
  36. nom.sin_port=PORT;
  37. nom.sin_addr.s_addr = INADDR_ANY;
  38. nom.sin_family=AF_INET;
  39. /*BIND*/
  40. if(bind(sd,&nom,sizeof(nom)) ==-1)
  41.  {
  42.  printf("erreur sur BIND \n" );
  43.  exit(2);
  44.  }
  45. /*LISTEN*/
  46. listen(sd,1);
  47. /*msg*/
  48. if((gethostname(nom_serveur,sizeof(nom_serveur))) ==-1)
  49.  {
  50.  perror("1-HOST LOCAL INCONNU\n" );
  51.  exit(2);
  52.  }
  53. printf("serveur sur : %s \n", nom_serveur);
  54. /*accept*/
  55. lg = sizeof(nom);
  56. acc = accept(sd,&nom,&lg);
  57. if(acc<0)
  58.  {
  59.  printf("appel a accept refuse \n" );
  60.  exit(0);
  61.  }
  62. /*lecture du msg*/
  63. fd = fopen("/home/timat/tmp/reponse.txt","w" );
  64. /*while(!feof(fd))
  65. {*/
  66. recv(acc,&buff,sizeof(buff),0);
  67. fwrite(&buff,sizeof(buff),1,fd);
  68. /*}*/
  69. printf("fichier reçu" );
  70. fclose(fd);
  71. close(acc);
  72. }

Reply

Marsh Posté le 13-10-2005 à 09:01:04   

Reply

Marsh Posté le 13-10-2005 à 09:46:22    

en fin de compte il y a des warning et erreur dans mon client aussi:
 
 

Code :
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <fcntl.h>
  7. #define PORT 2806
  8. char choix()
  9. {
  10. char car;
  11. car = getchar();
  12. while(getchar() != '\n');
  13. return(car);
  14. }
  15. main(argc,argv)
  16. int argc;
  17. char *argv[];
  18. {
  19. struct hostent *host;
  20. struct sockaddr_in nom;
  21. char buff;
  22. int sd;
  23. int fd;
  24. char car;
  25. /*Vérif nb paramètre*/
  26. if(argc!=3){
  27. perror("Utilisation: cleint sun_x message\n" );
  28. exit(3);
  29. }
  30. /*obtent°socket*/
  31. if((sd=socket(AF_INET,SOCK_STREAM,0)) == -1)
  32. {
  33. printf("appel a socket refuse\n" );
  34. exit(0);
  35. }
  36. /*recherche adresse internet du serveur*/
  37. if((host = gethostbyname(argv[1])) == NULL)
  38. {
  39. printf("site serveur non trouve\n" );
  40. exit(1);
  41. }
  42. printf("le nom retourne de gethostbyname = %s\n",host->h_name);
  43. /*printf("%s\n\n",host->h_aliases);*/
  44. /*preparation socket distant*/
  45. bzero((char*)&nom, sizeof(nom));
  46. bcopy(host->h_addr, &nom.sin_addr, host->h_length);
  47. nom.sin_port=PORT;
  48. nom.sin_family=AF_INET;
  49. /*connection serveur*/
  50. if((connect(sd,&nom,sizeof(nom))) ==-1)
  51. {
  52. printf("appel a connect refuse\n" );
  53. exit(0);
  54. }
  55. /*envoie msg*/
  56. fd = fopen(argv[2],"r" );
  57. while(!feof(fd))
  58. {
  59. fread(&buff,sizeof(buff),1,fd);
  60. send(sd,&buff,sizeof(car),0);
  61. /*printf("%s",&car);*/
  62. }
  63. printf("fichier envoyé\n" );
  64. fclose(fd);
  65. close(nom);
  66. }

Reply

Marsh Posté le 13-10-2005 à 10:35:56    

Ouais bon, tu aurais pu nous recopier tes erreurs, hein, ça aurait été plus sympa que de nous laisser compiler nous-même. :o
 
Ensuite, ça :

Code :
  1. main(argc,argv)
  2. int argc;
  3. char *argv[];
  4. {


ben c'est ignoble, on ne déclare plus une fonction comme ça depuis... hmm... 15 ans ?
 
Bref, remplace par :

int main(int argc, char **argv)


 
 
Quant aux erreurs elles-mêmes :

test.c:19: warning: return-type defaults to `int'
test.c: In function `main':
test.c:44: warning: implicit declaration of function `bzero'
test.c:51: warning: passing arg 2 of `bind' from incompatible pointer type
test.c:62: warning: implicit declaration of function `gethostname'
test.c:74: warning: passing arg 2 of `accept' from incompatible pointer type
test.c:82: warning: assignment makes integer from pointer without a cast
test.c:86: warning: passing arg 4 of `fwrite' makes pointer from integer without a cast
test.c:91: warning: passing arg 1 of `fclose' makes pointer from integer without a cast
test.c:92: warning: implicit declaration of function `close'
test.c:22: warning: unused variable `host'
test.c:19: warning: unused parameter `argc'
test.c:20: warning: unused parameter `argv'
test.c:93: warning: control reaches end of non-void function


 
19 : main() doit explicitement retourner un int
44 : bzero() est défini dans strings.h, manque le #include
51 : bind() attend un struct sockaddr *, pas un struct sockaddr_in *
62 : gethostname() est défini dans unistd.h, il manque le...
 
... euuuh. Dis, t'aurais pas codé au hasard, des fois ?
La majeure partie des tes erreurs c'est à cause de typage incorrect ou de fonctions dont tu as oublié le #include.
 
Vu que tu utilises des fonctions POSIX j'imagine que tu travailles sur un unix-like, alors utilise "man" sur les fonctions que tu ne connais pas.

Reply

Marsh Posté le 13-10-2005 à 10:42:14    

En plus de tes problèmes de warning dus aux include manquants, tu auras un gros soucis avec le "while (!feof(fd))" parce que cette instruction ne fait pas ce que tu crois.
feof ne sert pas à détecter la fin d'un fichier dasn une lecture, elle sert juste à te confirmer si, une fois la lecture terminée, cette lecture a été finie à cause de la fin du fichier.
 
Pour faire une boucle de lecture sur un fichier, on utilise juste le fait que la fonction de lecture elle-même renvoie une valeur particulière lorsque la fin de fichier est atteinte !!!
 
Exemples:
while ((carac=fgetc(...)) != EOF)
while (fgets(...) != NULL)
while (fread(...) > 0)
 
Remarque perso: Je conseillerais plutôt les fonctions "memset" et "memcpy" (standard) plutôt que "bzero" et "bcopy"
 
Ici un cours sur les sockets sous Unix : http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
 

Elmoricq a écrit :


Bref, remplace par :

int main(int argc, char **argv)



 
Moi j'écrirais plutôt

int main(int argc, char *argv[])


 


Message édité par Sve@r le 13-10-2005 à 11:00:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed