[Sockets] - Error en BIND

Iniciado por farresito, 25 Abril 2011, 19:24 PM

0 Miembros y 1 Visitante están viendo este tema.

farresito

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 (cpp) [Seleccionar]
#include <iostream>
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int main()
{
    int desc_serv, desc_cliente //Descriptores;
    int rv //Comprueba el estado de GETADDRINFO;
    struct addrinfo structserv //Estructura usada en GETADDRINFO;
    struct addrinfo *resultados //Estructura resultante de GETADDRINFO;
    struct addrinfo structcliente //Estructura del CLIENTE;

    memset(&structserv, 0, sizeof (structserv));


    structserv.ai_family = AF_UNSPEC;
    structserv.ai_socktype = SOCK_STREAM;
    structserv.ai_flags = AI_PASSIVE;

    //GetAddrInfo
    if ((rv = getaddrinfo(NULL, "16969", &structserv, &resultados)) != 0)
    {
        cout << "Error en GETADDRINFO" << endl;
        exit(1);
    }

    //Socket
    if ((desc_serv = socket(resultados->ai_family, resultados->ai_socktype, resultados->ai_protocol) == -1))
    {
        cout << "Error en SOCKET" << endl;
        exit(1);
    }

    //Bind
    if (bind(desc_serv, resultados->ai_addr, resultados->ai_addrlen) == -1)
    {
        cout << "Error en BIND" << endl;
        exit(1);
    }

    //Listen
    if ((listen(desc_serv, 10)) == -1)
    {
        cout << "Error en LISTEN" << endl;
        exit(1);
    }

    //Accept
    if ((desc_cliente = accept(desc_serv, structcliente.ai_addr, 0)) == -1)
    {
        cout << "Error en ACCEPT" << endl;
        exit(1);
    }
    else
    {
        cout << "¡Funciona!" << endl;
    }
}


Un abrazo!

Garfield07

Lo más seguro es que te bloquea el firewall, no tienes permisos, el puerto no está abierto... ¡Ohh Dios mío, qué largo!


#include <sys/socket.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv [])
{
printf ("SmallServ 2.0 - Sagrini 2010 - elhacker.NET\n");

if (argc<2)
{
printf ("Use: %s <port>\n\n", argv [0]);
return 1;
}

int sockfd, newsock;
struct sockaddr_in client, host;
int size=sizeof (client);

sockfd=socket (2, 1, 0);
host.sin_family=AF_INET;
host.sin_port=htons (atoi (argv [1]));
host.sin_addr.s_addr=0;
bind (sockfd, (struct sockaddr*)&host, sizeof (struct sockaddr));
listen (sockfd, 3);

while (1)
{
newsock=accept (sockfd, (struct sockaddr*)&client, &size);
printf ("Everything's OK from %s:%d!\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
send (newsock, "OK!\r\n", 5, 0);
close (newsock);
}
close (sockfd);
return 0;
}


PS:
Un saludo. Sagrini


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

farresito

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!