Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2791 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur dans code client-serveur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur dans code client-serveur

n°1221773
popov
Posté le 13-10-2005 à 09:01:04  profilanswer
 

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. }

mood
Publicité
Posté le 13-10-2005 à 09:01:04  profilanswer
 

n°1221795
popov
Posté le 13-10-2005 à 09:46:22  profilanswer
 

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. }

n°1221835
Elmoricq
Modérateur
Posté le 13-10-2005 à 10:35:56  profilanswer
 

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.

n°1221840
Sve@r
Posté le 13-10-2005 à 10:42:14  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur dans code client-serveur

 

Sujets relatifs
Ou je doit insere ce code ?[RESOLU][Access / SQL] Erreur OVERFLOW lors de l'update de ma BDD !
erreur sur un fprintfTrouve pas l'erreur (Calcul de Rho) + Erreur dans triage
mettre un fichier sur serveurErreur Incomprise ...
Erreur de syntax...[SQL] Erreur #306 sur Requete comparant 2 mémo ! Help plz
récupérer dans mon code des variables depuis le config.acErreur objet...
Plus de sujets relatifs à : Erreur dans code client-serveur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR