elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Problema] Conexión Sockets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Problema] Conexión Sockets  (Leído 4,234 veces)
farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
[Problema] Conexión Sockets
« en: 31 Marzo 2011, 23:37 pm »

Acabo de empezar con Sockets y generalmente entiendo todo, pero no logro arreglar un error en accept(), aun habiendo leído otros ejemplos. Agradecería muchísimo a quien pudiese echarme una mano, pues llevo un tiempo y no se que pasa. El ejemplo está ordenadito, así que no debería ser un problema entenderlo.

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <arpa/inet.h>
  9. #include <stdio.h>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. int main()
  15. {
  16.    //Estructuras
  17.    struct sockaddr_in servidor;
  18.    struct sockaddr_in cliente;
  19.  
  20.    //Otras variables
  21.    int desc_cliente, desc_servidor;
  22.    int puerto = 3550, max_conex = 2, size;
  23.  
  24.    //Funcinn SOCKET
  25.    if (desc_servidor = socket(AF_INET, SOCK_STREAM, 0) == -1)
  26.    {
  27.        printf("Hubo un error en SOCKET");
  28.        exit (-1);
  29.    }
  30.  
  31.    //Estructura SOCKADDR_IN
  32.    servidor.sin_family = AF_INET;
  33.    servidor.sin_port = htons(puerto);
  34.    servidor.sin_addr.s_addr = INADDR_ANY;
  35.    memset(servidor.sin_zero, 0, 8);
  36.  
  37.    //Funcion BIND
  38.    if (bind(desc_servidor, (struct sockaddr*) &servidor, sizeof(struct sockaddr)) == -1)
  39.    {
  40.        printf("Error en BIND");
  41.        exit(-1);
  42.    }
  43.  
  44.    //Funcion listen
  45.    if (listen(desc_servidor, max_conex) == -1)
  46.    {
  47.        printf("Error en LISTEN");
  48.        exit(-1);
  49.    }
  50.  
  51.    //Bucle + accept
  52.    while (1)
  53.    {
  54.        size = sizeof(struct sockaddr_in);
  55.        if (cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size))
  56.        {
  57.            printf("Error en ACCEPT");
  58.            exit(-1);
  59.        }
  60.  
  61.        printf("Tienes una conexión de %s \n", inet_ntoa(cliente.sin_addr));
  62.  
  63.        send(desc_cliente, "Bienvenido al servidor \n", 22, 0);
  64.        close (desc_cliente);
  65.    }
  66.  
  67. }

Los errores que me marca son los siguientes:
Código
  1. /home/farresito/Documentos/project/main.cpp||In function ‘int main()’:|
  2. /home/farresito/Documentos/project/main.cpp|25|warning: suggest parentheses around assignment used as truth value|
  3. /home/farresito/Documentos/project/main.cpp|55|error: invalid conversion from ‘int*’ to ‘socklen_t*’|
  4. /home/farresito/Documentos/project/main.cpp|55|error:   initializing argument 3 of ‘int accept(int, sockaddr*, socklen_t*)’|
  5. /home/farresito/Documentos/project/main.cpp|55|error: no match for ‘operator=’ in ‘cliente = accept(desc_servidor, ((sockaddr*)(& cliente)), ((socklen_t*)(& size)))’|
  6. /usr/include/netinet/in.h|226|note: candidates are: sockaddr_in& sockaddr_in::operator=(const sockaddr_in&)|
  7. ||=== Build finished: 3 errors, 1 warnings ===|
  8.  

Otra cosilla, porque se hace el bucle? Para que hasta que no haga un accept no termine? No acabo de entenderlo...

Un abrazo de antemano. Muchas gracias por el soporte que me habéis dado hasta ahora.

Saludos


En línea

poitier

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: [Problema] Conexión Sockets
« Respuesta #1 en: 1 Abril 2011, 09:11 am »

El error es este:


        if (cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size))


Cliente lo has puesto tipo struct sockaddr_in. La llamada al sistema accept, devuelve el descriptor de socket asociado a la nueva conexión del cliente. Por lo tanto debe de ser un int. Para que te funcione tienes que poner desc_cliente.

En cuanto al bucle, haces un bucle infinito while(1). En dicho bucle aceptas conexiones entrantes, creas un socket asociadas a dichas conexiones (con accept) y envías el mensaje al cliente. Cierras la conexión con el cliente (close desc_cliente) y vuelta empezar.

Un saludo


En línea

farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: [Problema] Conexión Sockets
« Respuesta #2 en: 1 Abril 2011, 14:37 pm »

Gracias por responder, poitier. He hecho el cambio de cliente por desc_cliente en la función accept y me marca prácticamente los mismos errores. La verdad no se que pasa.

Te entendí bien, y hice el cambio para que lo que retornase la función accept se fuera a la variable descriptora de cliente.

Un abrazo. Aprecio de verdad vuestra ayuda :-*
En línea

poitier

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: [Problema] Conexión Sockets
« Respuesta #3 en: 3 Abril 2011, 18:12 pm »

Gracias por responder, poitier. He hecho el cambio de cliente por desc_cliente en la función accept y me marca prácticamente los mismos errores. La verdad no se que pasa.

Te entendí bien, y hice el cambio para que lo que retornase la función accept se fuera a la variable descriptora de cliente.

Un abrazo. Aprecio de verdad vuestra ayuda :-*

Perdona por la tardanza, farresito, se me fue el melón y se me olvidó responder.

Veamos, hay varias cosas que tienes que corregir:

  • Estás programando en C, por lo que el #include <iostream> y el using namespace std, te sobra. Eso es para c++.
  • Tienes que poner #include <unistd.h> para la función close
  • El resto de warnings no son importantes

Mira a ver si te funciona así, sino, pregunta y lo miramos.

Un saludo y suerte
En línea

Garfield07


Desconectado Desconectado

Mensajes: 1.121


¡Este año voy a por todas! JMJ 2011


Ver Perfil WWW
Re: [Problema] Conexión Sockets
« Respuesta #4 en: 4 Abril 2011, 21:15 pm »

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <arpa/inet.h>
  9. #include <stdio.h>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. int main()
  15. {
  16.    struct sockaddr_in servidor;
  17.    struct sockaddr_in cliente;
  18.  
  19.    //Otras variables
  20.    int desc_cliente, desc_servidor;
  21.    int puerto = 3550, max_conex = 2, size;
  22.  
  23.    //Funcinn SOCKET
  24.    if ((desc_servidor = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  25.    {
  26.        printf("Hubo un error en SOCKET");
  27.        exit (-1);
  28.    }
  29.  
  30.    //Estructura SOCKADDR_IN
  31.    servidor.sin_family = AF_INET;
  32.    servidor.sin_port = htons(puerto);
  33.    servidor.sin_addr.s_addr = INADDR_ANY;
  34.    memset(servidor.sin_zero, 0, 8);
  35.  
  36.    //Funcion BIND
  37.    if (bind(desc_servidor, (struct sockaddr*) &servidor, sizeof(struct sockaddr)) == -1)
  38.    {
  39.        printf("Error en BIND");
  40.        exit(-1);
  41.    }
  42.  
  43.    //Funcion listen
  44.    if (listen(desc_servidor, max_conex) == -1)
  45.    {
  46.        printf("Error en LISTEN");
  47.        exit(-1);
  48.    }
  49.  
  50.    //Bucle + accept
  51.    while (1)
  52.    {
  53.        size = sizeof(struct sockaddr_in);
  54.        if ((cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size))==-1)
  55.        {
  56.            printf("Error en ACCEPT");
  57.            exit(-1);
  58.        }
  59.  
  60.        printf("Tienes una conexión de %s \n", inet_ntoa(cliente.sin_addr));
  61.  
  62.        send(desc_cliente, "Bienvenido al servidor \n", 22, 0);
  63.        close (desc_cliente);
  64.    }
  65. }
  66.  

Me dice que tengo un parásito en un puñado de líneas, y el código se debería mejorar mucho, pero ahí queda. Te pongo otro código, el tuyo es muy largo y enrevesado. 100% casero ;)
Código
  1. #include <stdio.h>          //Funciones basicas
  2. #include <string.h>         //StrCmp
  3. #include <stdlib.h>         //Exit y otras
  4. #include <arpa/inet.h>      //struct sockaddr_in
  5. #include <sys/socket.h>     //Socket, Connect...
  6.  
  7. struct sockaddr_in host, client;    //Declaraciones
  8. int a=sizeof (struct sockaddr);
  9. int newsock;
  10. int sockfd;
  11. int main (int argc, char *argv [])
  12. {
  13.    printf ("Code 1.0  By Sagrini (2010)\n");
  14.    if ((sockfd=socket (2, 1, 0))==-1)
  15.    {
  16.        printf ("Error abriendo socket...\n\n");
  17.        return 1;
  18.    }
  19.    host.sin_port=htons(31337);
  20.    host.sin_family=AF_INET;
  21.    host.sin_addr.s_addr=0;
  22.    memset (host.sin_zero, 0, 8);
  23.    if(bind(sockfd,(struct sockaddr*)&host,sizeof(host))==-1)
  24.    {
  25.        printf ("Error haciendo binding...\n\n");
  26.        return 1;
  27.    }
  28.    if(listen(sockfd,5)==-1)
  29.    {
  30.        printf ("Error escuchando...\n\n");
  31.        return 1;
  32.    }
  33.    while (1)
  34.    {
  35.    if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==-1)
  36.    {
  37.        printf ("Error esperando conectando...\n\n");
  38.        return 1;
  39.    }
  40.    printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  41.    send (newsock, "Hola!\r\n", 7, 0);
  42.    close (newsock);
  43.    }
  44.    close (sockfd);
  45.    return 0;
  46. }
  47.  
« Última modificación: 6 Abril 2011, 10:15 am por Sagrini » En línea



* 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
poitier

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: [Problema] Conexión Sockets
« Respuesta #5 en: 4 Abril 2011, 22:12 pm »

Me dice que tengo un parásito en un puñado de líneas, y el código se debería mejorar mucho, pero ahí queda. Te pongo otro código, el tuyo es muy largo y enrevesado. 100% casero ;)
Código
  1. #include <stdio.h>          //Funciones basicas
  2. #include <string.h>         //StrCmp
  3. #include <stdlib.h>         //Exit y otras
  4. #include <arpa/inet.h>      //struct sockaddr_in
  5. #include <sys/socket.h>     //Socket, Connect...
  6.  
  7. struct sockaddr_in host, client;    //Declaraciones
  8. int a=sizeof (struct sockaddr);
  9. int newsock;
  10. int sockfd;
  11. int main (int argc, char *argv [])
  12. {
  13.    printf ("Code 1.0  By Sagrini (2010)\n");
  14.    if ((sockfd=socket (2, 1, 0))==1)
  15.    {
  16.        printf ("Error abriendo socket...\n\n");
  17.        return 1;
  18.    }
  19.    host.sin_port=htons(31337);
  20.    host.sin_family=AF_INET;
  21.    host.sin_addr.s_addr=0;
  22.    memset (host.sin_zero, 0, 8);
  23.    if(bind(sockfd,(struct sockaddr*)&host,sizeof(host))==1)
  24.    {
  25.        printf ("Error haciendo binding...\n\n");
  26.        return 1;
  27.    }
  28.    if(listen(sockfd,5)==1)
  29.    {
  30.        printf ("Error escuchando...\n\n");
  31.        return 1;
  32.    }
  33.    while (1)
  34.    {
  35.    if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==1)
  36.    {
  37.        printf ("Error esperando conectando...\n\n");
  38.        return 1;
  39.    }
  40.    printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  41.    send (newsock, "Hola!\r\n", 7, 0);
  42.    close (newsock);
  43.    }
  44.    close (sockfd);
  45.    return 0;
  46. }
  47.  

Pues yo veo el mismo código que el de farresito, eso sí, con menos espacios  :P

Tienes varios errores en las funciones socket, bind, accept...
El error es cuando devuelve -1, no 1.


Te recomiendo que uses las constantes simbólicas AF_INET, SOCK_STREAM, etc. y no los valores asociados.
« Última modificación: 4 Abril 2011, 22:17 pm por poitier » En línea

Garfield07


Desconectado Desconectado

Mensajes: 1.121


¡Este año voy a por todas! JMJ 2011


Ver Perfil WWW
Re: [Problema] Conexión Sockets
« Respuesta #6 en: 5 Abril 2011, 21:13 pm »

Pues yo veo el mismo código que el de farresito, eso sí, con menos espacios  :P

Tienes varios errores en las funciones socket, bind, accept...
El error es cuando devuelve -1, no 1.

Te recomiendo que uses las constantes simbólicas AF_INET, SOCK_STREAM, etc. y no los valores asociados.

No, el mío corre bien. El error del primer código es que necesita poner entre paréntesis asignaciones. Y se lo puse porque esperaba que le ayudase  ;)
Luego... cierto, me has pillado. Fallo mío, o más bien del teclado xD. Nunca me acostumbraré a estas cosas xD. Ahora modifico, gracias.
Y... me ahorra espacio y memoria. Y sé que son cada uno, pero es pura pereza  :)

PS: Un detalle, haz siempre caso de todos los warnings. Te ahorrará problemas  ;D
Sagrini
« Última modificación: 6 Abril 2011, 10:14 am por Sagrini » En línea



* 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
poitier

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: [Problema] Conexión Sockets
« Respuesta #7 en: 5 Abril 2011, 23:01 pm »

No, el mío corre bien. El error del primer código es que necesita poner entre paréntesis asignaciones. El mío corre y el suyo no.
Luego... cierto, me has pillado. Fallo mío, o más bien del teclado xD. Nunca me acostumbraré a estas cosas...
Y... me ahorra espacio y memoria. Y sé que son cada uno, pero gracias de todos modos.  :¬¬

PD: Y si me vas a recomendar tú eso yo te recomendaré que hagas caso de todos los warnings.

Lo que te dije te lo has tomado a mal, no pretendía ofenderte, sino ayudarte. Pero no te preocupes, que no va a volver a pasar. Tu llevas razón, gracías por tu recomendación ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
fallo conexión sockets tras cambiar router
Programación Visual Basic
dionisodoro 3 7,524 Último mensaje 15 Febrero 2010, 21:25 pm
por fary
[Duda][Sockets] Procesod e conexión entre dos PCs
Scripting
RyogiShiki 0 3,084 Último mensaje 12 Mayo 2011, 05:52 am
por RyogiShiki
¡Error de Conexión con Sockets!
.NET (C#, VB.NET, ASP)
Jesuscc29 4 19,585 Último mensaje 16 Junio 2011, 21:46 pm
por Jesuscc29
Leer conexion mediante sockets
Análisis y Diseño de Malware
.:Weeds:. 3 2,769 Último mensaje 20 Agosto 2011, 02:08 am
por .:Weeds:.
Sockets no orientados a conexion usando select
Programación C/C++
rootLink 0 3,014 Último mensaje 5 Septiembre 2022, 14:36 pm
por rootLink
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines