mini serveur en C: setsockopt() == -1

mini serveur en C: setsockopt() == -1 - C - Programmation

Marsh Posté le 10-10-2013 à 18:41:45    

Bonjour à tous! :hello:  
je me suis mis à la création d'un mini serveur, non pas pour héberger un site mais pour voir "comment ça fonctionne".
j'ai suivi un code dans un bouquin:
 

Code :
  1. #include "includes.h"
  2. //defines
  3. #define PORT 80
  4. #define WEBROOT "./web-serverX_ROOT/"
  5. int main(void){
  6. int sockfd, new_sockfd, yes=1;
  7. struct sockaddr_in host_addr, client_addr;
  8. socklen_t sin_size;
  9. printf("Accepting web requests on port %d\n", PORT);
  10. if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
  11. fatal("in socket" );
  12. if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
  13. fatal("setting socket option SO_REUSEADDR" );
  14. host_addr.sin_family = AF_INET;  // Ordre des octets de l'hôte.
  15. host_addr.sin_port = htons(PORT); // Ordre des octets du réseau (entier court).
  16. host_addr.sin_addr.s_addr = 0;  // Remplir automatiquement l'IP.
  17. memset(&(host_addr.sin_zero), '\0', 8); // Reste de la structure à 0.
  18. if(bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr)) == -1)
  19. fatal("binding to socket" );
  20. if(listen(sockfd, 20) == -1)
  21. fatal("listenning on socket" );
  22. while(1) {  // Boucle d'acceptation des connexions entrantes.
  23. sin_size = sizeof(struct sockaddr_in);
  24. new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
  25. if(new_sockfd == -1)
  26.  fatal("accepting connection" );
  27. handle_connection(new_sockfd, &client_addr);
  28. }
  29. return 0;
  30. }


 
mais lors de l'éxécution, voici ce que me donne le terminal Linux:

Code :
  1. monstigule@monstigule-PC:~/Server$ gcc main.c
  2. monstigule@monstigule-PC:~/Server$ ./a.out
  3. Accepting web requests on port 80
  4. Error: setting socket option SO_REUSEADDR
  5. monstigule@monstigule-PC:~/Server$


 
j'en conclus donc que  

Code :
  1. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))

retourne la valeur -1.
mais pourquoi? je n'arrive pas à trouver la solution... :pt1cable:  
 
merci d'avance  :)

Reply

Marsh Posté le 10-10-2013 à 18:41:45   

Reply

Marsh Posté le 10-10-2013 à 20:05:20    

monstigule a écrit :

Code :
  1. printf("Accepting web requests on port %d\n", PORT);
  2. if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
  3. fatal("in socket" );




 
Ha, ha, d'habitude on confond "=" à la place de "==". Toi, tu viens de faire l'inverse.

Reply

Marsh Posté le 10-10-2013 à 20:48:49    

tpierron a écrit :


 
Ha, ha, d'habitude on confond "=" à la place de "==". Toi, tu viens de faire l'inverse.


 
oui exact c'est evident merci :)
 
maintenant j'ai l'erreur

Code :
  1. Error: binding to socket


...
 
merci de ta réponse :)

Reply

Marsh Posté le 10-10-2013 à 21:55:52    

Les ports < 1024 nécessite les droits administrateur pour être ouvert en écoute. Utilise la fonction perror() au lieu de fatal(), si tu as une réponse du genre "permission denied", c'est à cause de ça.
 
Bref utilise un autre port, du genre 8080.

Reply

Marsh Posté le 11-10-2013 à 08:27:36    

ah merci j'ai regardé la suite du bouquin, il fallait utiliser:
gcc -o main main.c
sudo chown root ./main
sudo chmod u+s ./main
puis ./main
 
bref oui il fallait le lancer en admin
merci :)

Reply

Sujets relatifs:

Leave a Replay

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