Comunidad PHPeros

Lenguajes => C / C++ => Mensaje iniciado por: Warlox en 19 de Enero de 2011, 23:26:25 pm

Título: Problema con sockets en Linux
Publicado por: Warlox 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 ^^
Título: Re:Problema con sockets en Linux
Publicado por: HiddenHlF 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.
Título: Re:Problema con sockets en Linux
Publicado por: Physlet 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)
Título: Re:Problema con sockets en Linux
Publicado por: Warlox 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.
Título: Re:Problema con sockets en Linux
Publicado por: CarlosRdrz 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!
Título: Re:Problema con sockets en Linux
Publicado por: Warlox 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 ^^