Autor Tema: Problema con sockets en Linux  (Leído 2695 veces)

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Problema con sockets en Linux
« en: 19 de Enero de 2011, 23:26:25 pm »
¡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: [Seleccionar]
#include <netinet/in.h> /* Para el struct sockaddr_in */
#include <sys/types.h> /* Para los tipos de socket */
#include <sys/socket.h> /* Para llamar al socket */
#include <stdio.h> /* Para el manejo de errores por perror() */
#include <stdlib.h> /* Para salir del programa mediante exit() */
#include <errno.h> /* Para utilizar errno en exit() */
#include <strings.h> /* Para utilizar bzero() */
#include <arpa/inet.h> /* Para usar inet_ntoa() */
#include <unistd.h> /* Para usar close() */

#define PUERTO 1707
#define MAXBUF 1024

int main (int argc, char const* argv[])
{
int sockfd;
struct sockaddr_in self;
char buffer[MAXBUF];

if ((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1)
{
perror("Socket");
exit(errno);
}

bzero(&self, sizeof(self));
self.sin_family = AF_LOCAL;
self.sin_port = htons(PUERTO);
self.sin_addr.s_addr = INADDR_ANY;

if(bind(sockfd, (struct sockaddr *)&self, sizeof(self)) == -1)
{
perror("socket--bind");
exit(errno);
}

if(listen(sockfd, 1) == -1)
{
perror("socket--listen");
exit(errno);
}

while(1)
{
int clientfd;
struct sockaddr_in client_addr;
int addrlen = sizeof(client_addr);

clientfd = accept(sockfd, (struct sockaddr*)&client_addr, (socklen_t*)&addrlen);
printf("%s:%d conectado\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0);
close(clientfd);
}

close(sockfd);
return 0;

}



client.cpp
Código: [Seleccionar]
#include <netinet/in.h> /* Para el struct sockaddr_in */
#include <sys/types.h> /* Para los tipos de socket */
#include <sys/socket.h> /* Para llamar al socket */
#include <stdio.h> /* Para el manejo de errores por perror() */
#include <stdlib.h> /* Para salir del programa mediante exit() */
#include <errno.h> /* Para utilizar errno en exit() */
#include <strings.h> /* Para utilizar bzero() */
#include <arpa/inet.h> /* Para usar inet_aton() */
#include <unistd.h> /* Para usar close() */

#define MAXBUF 1024
#define PUERTO 1707
#define SERVER_ADDR "127.0.0.1"

int main (int argc, char const* argv[])
{
int sockfd;
struct sockaddr_in dest;
char buffer[MAXBUF];

/* Creación del socket */
if((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1)
{
perror("Socket");
exit(errno);
}

/* Configuración del socket */
dest.sin_family = AF_LOCAL;
dest.sin_port = htons(PUERTO);
dest.sin_addr.s_addr = inet_addr(SERVER_ADDR);

/* Conectar al servidor */
if(connect(sockfd, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == -1)
{
perror("Conect");
exit(errno);
}

/* Recibir respuesta */
bzero(buffer, MAXBUF);
recv(sockfd, buffer, sizeof(buffer), 0);
printf("%s\n", buffer);

/* Limpiar todo */
close(sockfd);
return 0;
}



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


Comunidad PHPeros

Problema con sockets en Linux
« en: 19 de Enero de 2011, 23:26:25 pm »

Desconectado HiddenHlF

  • PHPero Avanzado
  • ****
  • Mensajes: 285
  • Karma: 7
  • Sexo: Masculino
  • The Hidden
    • Ver Perfil
Re:Problema con sockets en Linux
« Respuesta #1 en: 20 de Enero de 2011, 00:15:09 am »
Hola kevin poquito te puedo ayudar porque de sockets en C++ ni idea jaja pero por PHP que me da que los fundamentos básicos son iguales XD en cuanto al cliente no se, pero en cuanto a socket--bind posiblemente es por eso porque tienes el proceso sin terminar como tu has dicho... prueba usando otro puerto a ver si te desaparece ese error :/, en caso de que no te salga error al cambiar puerto la primera vez y el resto si ya sabes que el fallo está al terminar el proceso jeje. Para el cliente ni idea xP siento poder ayudar practicamente nada jeje.

Saludos.

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Problema con sockets en Linux
« Respuesta #2 en: 20 de Enero de 2011, 01:04:52 am »
No estoy muy familiarizado con esto, pero bueno... Aclárame una duda, qué es esto: while(1)

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Problema con sockets en Linux
« Respuesta #3 en: 20 de Enero de 2011, 04:04:09 am »
Es para que el bucle se repita infinitamente y esté siempre escuchando peticiones entrantes y aceptándolas.
- Moderador de PHP


Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Problema con sockets en Linux
« Respuesta #4 en: 20 de Enero de 2011, 14:14:24 pm »
Hola!

A ver... lo del servidor puede ser causado por el propio while(1).
Dado que siempre se ejecuta el while y nunca se sale de ahi, la linea que está detrás (el close que cierra el socket) no se ejecuta, y por lo tanto se mantiene abierto.

¿Has mirado si despues de reiniciar te sigue dando ese problema?

El problema del cliente no tengo ni idea de por qué puede ser.
Parece ser que falta algún archivo o algo.

Saludos!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Problema con sockets en Linux
« Respuesta #5 en: 20 de Enero de 2011, 20:03:28 pm »
Vale, el problema ya está resuelto, lo que hice fue lo siguiente:

1- Eliminando el proceso que quedaba abierto, ya que el puerto quedaba abierto y no se podía utilizar más.
2- Cambiando el dominio de los sockets, quité AF_LOCAL y puse AF_INET, y me va de maravilla.

Y eso es todo :P
Saludos ^^
- Moderador de PHP