Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: farresito en 25 Abril 2011, 19:24 pm



Título: [Sockets] - Error en BIND
Publicado por: farresito en 25 Abril 2011, 19:24 pm
Holas a todos,

Llevo bastante tiempo con un error que me da y no lo logro resolver. NO ES DE COMPILAR, porque me compila sin errores, sino que cuando ejecuto el programa me marca 'error en BIND', que es el IF que tengo puesto, pero creo que todo está bien. El código no está terminado del todo, porque estaba haciendo pruebas en aplicar la estructura storage en vez de una _in normal, pero hasta bind no deberia haber problema

Les dejo el código a ver si pueden ver algun error.

Código
  1. #include <iostream>
  2. #include <signal.h>
  3. #include <arpa/inet.h>
  4. #include <netdb.h>
  5. #include <netinet/in.h>
  6. #include <sys/wait.h>
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <unistd.h>
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. using namespace std;
  15.  
  16. int main()
  17. {
  18.    int desc_serv, desc_cliente //Descriptores;
  19.    int rv //Comprueba el estado de GETADDRINFO;
  20.    struct addrinfo structserv //Estructura usada en GETADDRINFO;
  21.    struct addrinfo *resultados //Estructura resultante de GETADDRINFO;
  22.    struct addrinfo structcliente //Estructura del CLIENTE;
  23.  
  24.    memset(&structserv, 0, sizeof (structserv));
  25.  
  26.  
  27.    structserv.ai_family = AF_UNSPEC;
  28.    structserv.ai_socktype = SOCK_STREAM;
  29.    structserv.ai_flags = AI_PASSIVE;
  30.  
  31.    //GetAddrInfo
  32.    if ((rv = getaddrinfo(NULL, "16969", &structserv, &resultados)) != 0)
  33.    {
  34.        cout << "Error en GETADDRINFO" << endl;
  35.        exit(1);
  36.    }
  37.  
  38.    //Socket
  39.    if ((desc_serv = socket(resultados->ai_family, resultados->ai_socktype, resultados->ai_protocol) == -1))
  40.    {
  41.        cout << "Error en SOCKET" << endl;
  42.        exit(1);
  43.    }
  44.  
  45.    //Bind
  46.    if (bind(desc_serv, resultados->ai_addr, resultados->ai_addrlen) == -1)
  47.    {
  48.        cout << "Error en BIND" << endl;
  49.        exit(1);
  50.    }
  51.  
  52.    //Listen
  53.    if ((listen(desc_serv, 10)) == -1)
  54.    {
  55.        cout << "Error en LISTEN" << endl;
  56.        exit(1);
  57.    }
  58.  
  59.    //Accept
  60.    if ((desc_cliente = accept(desc_serv, structcliente.ai_addr, 0)) == -1)
  61.    {
  62.        cout << "Error en ACCEPT" << endl;
  63.        exit(1);
  64.    }
  65.    else
  66.    {
  67.        cout << "¡Funciona!" << endl;
  68.    }
  69. }
  70.  

Un abrazo!


Título: Re: [Sockets] - Error en BIND
Publicado por: Garfield07 en 26 Abril 2011, 18:40 pm
Lo más seguro es que te bloquea el firewall, no tienes permisos, el puerto no está abierto... ¡Ohh Dios mío, qué largo!

Código
  1. #include <sys/socket.h>
  2. #include <arpa/inet.h>
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. int main (int argc, char *argv [])
  9. {
  10. printf ("SmallServ 2.0 - Sagrini 2010 - elhacker.NET\n");
  11.  
  12. if (argc<2)
  13. {
  14. printf ("Use: %s <port>\n\n", argv [0]);
  15. return 1;
  16. }
  17.  
  18. int sockfd, newsock;
  19. struct sockaddr_in client, host;
  20. int size=sizeof (client);
  21.  
  22. sockfd=socket (2, 1, 0);
  23. host.sin_family=AF_INET;
  24. host.sin_port=htons (atoi (argv [1]));
  25. host.sin_addr.s_addr=0;
  26. bind (sockfd, (struct sockaddr*)&host, sizeof (struct sockaddr));
  27. listen (sockfd, 3);
  28.  
  29. while (1)
  30. {
  31. newsock=accept (sockfd, (struct sockaddr*)&client, &size);
  32. printf ("Everything's OK from %s:%d!\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  33. send (newsock, "OK!\r\n", 5, 0);
  34. close (newsock);
  35. }
  36. close (sockfd);
  37. return 0;
  38. }
  39.  

PS:
Un saludo. Sagrini


Título: Re: [Sockets] - Error en BIND
Publicado por: farresito en 26 Abril 2011, 19:52 pm
Gracias por respinder Sagrini.

De hecho, ya sabía usar más o menos la forma antigua, que es la que usas tu, con el sockaddr_in, pero recientemente sacaron la estructura addrinfo, que tiene la función getaddrinfo que te lo rellena todo, y que es más recomendado, segun comentan en la web oficial del POSIX. Es por ello que me decidí a aprenderlo, porque, a más, si te fijas, no tienes que usar htons, hacer cambios con (struct sockaddr *)... etc. No se, se ve el código más limpio en mi opinión.

Puedes echar una ojeada en la web de beej: http://beej.us/guide/bgnet/

En fin, agradezco de verdad que me hayas respondido ;). Ya veré que es lo que realmente le pasa al trasto este y a ver si se puede arreglar, postear el código y aprender de esta forma nueva :)

Un abrazo!