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.
#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!
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
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!