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 con sockets en Linux
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con sockets en Linux  (Leído 4,263 veces)
Warlox

Desconectado Desconectado

Mensajes: 4


A veces hay que aprender a correr antes de caminar


Ver Perfil
Problema con sockets en Linux
« en: 20 Enero 2011, 05:16 am »

¡Hola!, al fin logré crear un servidor y un socket en C++ (mi primer socket), pero, a la hora de ejecutarlos, ambos archivos (el cliente y el servidor) me dan error.

Citar
Servidor:
socket--bind: Address already in use

Cliente:
Conect: No such file or directory

Bueno, esos son los dos errores que el programa me dá, el error del servidor al principio no me lo daba (la primera vez que ejecuté el archivo), pero de seguro el puerto no se cerró completamente, o el proceso no terminó, por eso que seguramente el puerto me da error :S

Ahora, el código de ambos archivos:

server.cpp
Código
  1. #include <netinet/in.h> /* Para el struct sockaddr_in */
  2. #include <sys/types.h> /* Para los tipos de socket */
  3. #include <sys/socket.h> /* Para llamar al socket */
  4. #include <stdio.h> /* Para el manejo de errores por perror() */
  5. #include <stdlib.h> /* Para salir del programa mediante exit() */
  6. #include <errno.h> /* Para utilizar errno en exit() */
  7. #include <strings.h> /* Para utilizar bzero() */
  8. #include <arpa/inet.h> /* Para usar inet_ntoa() */
  9. #include <unistd.h> /* Para usar close() */
  10.  
  11. #define PUERTO 1707
  12. #define MAXBUF 1024
  13.  
  14. int main (int argc, char const* argv[])
  15. {
  16. int sockfd;
  17. struct sockaddr_in self;
  18. char buffer[MAXBUF];
  19.  
  20. if ((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1)
  21. {
  22. perror("Socket");
  23. exit(errno);
  24. }
  25.  
  26. bzero(&self, sizeof(self));
  27. self.sin_family = AF_LOCAL;
  28. self.sin_port = htons(PUERTO);
  29. self.sin_addr.s_addr = INADDR_ANY;
  30.  
  31. if(bind(sockfd, (struct sockaddr *)&self, sizeof(self)) == -1)
  32. {
  33. perror("socket--bind");
  34. exit(errno);
  35. }
  36.  
  37. if(listen(sockfd, 1) == -1)
  38. {
  39. perror("socket--listen");
  40. exit(errno);
  41. }
  42.  
  43. while(1)
  44. {
  45. int clientfd;
  46. struct sockaddr_in client_addr;
  47. int addrlen = sizeof(client_addr);
  48.  
  49. clientfd = accept(sockfd, (struct sockaddr*)&client_addr, (socklen_t*)&addrlen);
  50. printf("%s:%d conectado\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
  51.  
  52. send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0);
  53. close(clientfd);
  54. }
  55.  
  56. close(sockfd);
  57. return 0;
  58.  
  59. }



client.cpp
Código
  1. #include <netinet/in.h> /* Para el struct sockaddr_in */
  2. #include <sys/types.h> /* Para los tipos de socket */
  3. #include <sys/socket.h> /* Para llamar al socket */
  4. #include <stdio.h> /* Para el manejo de errores por perror() */
  5. #include <stdlib.h> /* Para salir del programa mediante exit() */
  6. #include <errno.h> /* Para utilizar errno en exit() */
  7. #include <strings.h> /* Para utilizar bzero() */
  8. #include <arpa/inet.h> /* Para usar inet_aton() */
  9. #include <unistd.h> /* Para usar close() */
  10.  
  11. #define MAXBUF 1024
  12. #define PUERTO 1707
  13. #define SERVER_ADDR "127.0.0.1"
  14.  
  15. int main (int argc, char const* argv[])
  16. {
  17. int sockfd;
  18. struct sockaddr_in dest;
  19. char buffer[MAXBUF];
  20.  
  21. /* Creación del socket */
  22. if((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1)
  23. {
  24. perror("Socket");
  25. exit(errno);
  26. }
  27.  
  28. /* Configuración del socket */
  29. dest.sin_family = AF_LOCAL;
  30. dest.sin_port = htons(PUERTO);
  31. dest.sin_addr.s_addr = inet_addr(SERVER_ADDR);
  32.  
  33. /* Conectar al servidor */
  34. if(connect(sockfd, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == -1)
  35. {
  36. perror("Conect");
  37. exit(errno);
  38. }
  39.  
  40. /* Recibir respuesta */
  41. bzero(buffer, MAXBUF);
  42. recv(sockfd, buffer, sizeof(buffer), 0);
  43. printf("%s\n", buffer);
  44.  
  45. /* Limpiar todo */
  46. close(sockfd);
  47. return 0;
  48. }



Bien, expertos de la materia, agradecería me pudiesen ayudar, ya que no tengo idea de qué diantres está pasando :S
Saludos ^^


En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Problema con sockets en Linux
« Respuesta #1 en: 20 Enero 2011, 06:38 am »

Este codigo acaso no es mio ?, lo conseguiste delrincondelc ? o por aqui ?... En fin, para eso lo publique.

Bueno, al punto... primero dime si hiciste modificaciones al codigo, porque tal cual lo publique funciona... que error o warning te da al compilar ?

En fin, a simple vista no ve nada malo, pero necesitaria compilarlo y probar.

Por otro lado checa su el PUERTO que tienes establecido en la variable definida, no esta ocupado por un programa.

Por cierto... de donde sacaste el code ?, que al parecer hasta yo lo extravie :(

Saludos !


« Última modificación: 20 Enero 2011, 06:45 am por Diabliyo » En línea

Warlox

Desconectado Desconectado

Mensajes: 4


A veces hay que aprender a correr antes de caminar


Ver Perfil
Re: Problema con sockets en Linux
« Respuesta #2 en: 20 Enero 2011, 06:46 am »

No sé si el código sea tuyo, busqué tantos que ni me acuerdo jaja. Al compilar no me da ningún error, por otro lado, cuando ejecuto el programa por primera vez, el server no me da error, pero cuando lo ejecuto por segunda vez, al parecer el puerto no se cierra, por eso me dice que lo estoy ocupando :S
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Problema con sockets en Linux
« Respuesta #3 en: 20 Enero 2011, 07:05 am »

No sé si el código sea tuyo, busqué tantos que ni me acuerdo jaja. Al compilar no me da ningún error, por otro lado, cuando ejecuto el programa por primera vez, el server no me da error, pero cuando lo ejecuto por segunda vez, al parecer el puerto no se cierra, por eso me dice que lo estoy ocupando :S

Bien ya entiendo, entonces lo que sucede es que el puerto se queda bindeado (bind() ) se queda colgada... la solucion es estabecer el socket como re-usuable.

El codigo va despues de socket() y antes de bidn():

Código:
        if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
            perror("setsockopt");
            exit(1);
        }

AQUI lo explica a detalle.

Por cierto, pasame el code por mensaje, pero el original

Saludos !
« Última modificación: 20 Enero 2011, 07:07 am por Diabliyo » En línea

Warlox

Desconectado Desconectado

Mensajes: 4


A veces hay que aprender a correr antes de caminar


Ver Perfil
Re: Problema con sockets en Linux
« Respuesta #4 en: 20 Enero 2011, 07:16 am »

¡Problema resuelto!

Lo que hice fue agregar eso que tu me dijiste para poder reutilizar puertos, y luego cambié el dominio de los sockets (quité el AF_LOCAL y puse AF_INET).
En línea

Garfield07


Desconectado Desconectado

Mensajes: 1.121


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


Ver Perfil WWW
Re: Problema con sockets en Linux
« Respuesta #5 en: 22 Enero 2011, 13:43 pm »

Si a alguien le sirve, aqui tengo otro code...
Código
  1.  
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. #include <signal.h>
  10. #include <time.h>
  11.  
  12. int socketfd, newsocket;
  13. char *filename;
  14.  
  15. void shutup (int signal)
  16. {
  17. FILE *log;
  18. log=fopen (filename, "a+");
  19. times ();
  20. printf ("Shutting down...\n\n");
  21. fprintf (log, "Shutting down...\n\n");
  22. close (newsocket);
  23. close (socketfd);
  24. exit (0);
  25. }
  26.  
  27. int times ()
  28. {
  29. FILE *log;
  30. time_t now=time (0);
  31. struct tm *ahora;
  32. char buffer [40];
  33. ahora=localtime ((const time_t*)&now);
  34. strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
  35. log=fopen (filename, "a+");
  36. printf ("%s   ", buffer);
  37. fprintf (log,"%s   ", buffer);
  38. return 0;
  39. }
  40.  
  41. int main (int argc, char *argv [])
  42. {
  43. time_t now=time (0);
  44. struct tm *ahora;
  45. char hora [40];
  46. ahora=localtime ((const time_t*)&now);
  47. strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
  48. printf ("SmallServ 2.0 - By Sagrini - Sagrini 2010 - %s\n", hora);
  49.  
  50. if (getuid()!=0)
  51. {
  52. printf ("This proccess must be run by root.\n\n");
  53. return 1;
  54. }
  55. if (argc<3)
  56. {
  57. printf ("Use: %s <PORT> <LOG> [MODE]\nMode:\t\t0) Fork the proccess to background [DEFAULT].\n\t\t1) Run in the terminal.\n\n", argv [0]);
  58. return 1;
  59. }
  60. int cont;
  61. FILE *log;
  62. struct sockaddr_in client, host;
  63. char buffer [1024];
  64. int size=sizeof (client);
  65.  
  66. filename = argv [2];
  67.  
  68. socketfd=socket (2, 1 ,  0);
  69. host.sin_family=AF_INET;
  70. host.sin_port=htons (atoi (argv [1]));
  71. host.sin_addr.s_addr=0;
  72.        int yes = 1;
  73. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int));
  74. bind (socketfd, (struct sockaddr*)&host, sizeof (struct sockaddr));
  75.  
  76. listen (socketfd, 3);
  77.  
  78. log=fopen (filename, "a+");
  79. times ();
  80. if (argv [3] != NULL && atoi (argv [3]) == 1)
  81. printf ("\nStarting up...\n\n");
  82. fprintf (log, "Starting up...\n\n");
  83.  
  84. signal (SIGTERM, shutup);
  85. signal (SIGINT, shutup);
  86.  
  87.  
  88. if (argv [3] == NULL || atoi (argv [3]) == 0)
  89. daemon (1, 0);
  90.  
  91. while (1)
  92. {
  93. newsocket=accept (socketfd, (struct sockaddr*)&client, &size);
  94.  
  95. log=fopen (filename, "a+");
  96. times ();
  97. printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  98. fprintf (log, "Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  99.  
  100. cont=recv (newsocket, &buffer, 1024, 0);
  101. while (cont>2)
  102. {
  103. printf ("%d", cont);
  104. log=fopen (filename, "a+");
  105. times ();
  106. buffer [cont-1]='\0';
  107. printf ("RECV %d bytes: %s ", cont-2, buffer);
  108. fprintf (log, "RECV %d bytes: %s\n", cont-2, buffer);
  109.  
  110. cont=recv (newsocket, &buffer, 1024, 0);
  111. }
  112. log=fopen (filename, "a+");
  113. times ();
  114. printf ("Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  115. fprintf (log, "Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  116. close (newsocket);
  117. }
  118. close (socketfd);
  119. return 0;
  120. }
  121.  

He añadido al original lo de
Código
  1.        int yes = 1;
  2. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int));
  3.  
Para que te funcione. El resto es original y mio. Probado y OK 100% sin warnings... No me vayas a decir que falla jeje...
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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sockets en linux
Programación C/C++
adri041289 1 2,006 Último mensaje 3 Junio 2010, 10:10 am
por pizarron
Problema con sockets en linux
Programación C/C++
DaniekL 3 2,129 Último mensaje 6 Marzo 2013, 19:31 pm
por 0xDani
Problema con linux sockets en c
Programación C/C++
jomoza 0 2,015 Último mensaje 14 Marzo 2015, 21:49 pm
por jomoza
Sockets linux
Programación C/C++
Poyoncio 6 2,357 Último mensaje 11 Septiembre 2016, 20:32 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines