[C con Clase] problema con sockets

nree p_westermani en hotmail.com
Mie Ene 30 18:43:15 CET 2008


Hola gente!!!

trabajo con eclipse en un ubuntu y estoy haciendo un programilla con sockets. Para empezar lo de siempre, un servidor concurrente y un cliente que pide peticiones. Mi problema viene al crear los procesos hijos, se supone que envian al cliente un saludo y listo, pero... me tira el perror al hacer el send y despues de un rato lo hace. Es decir, me explico, el servidor se queda un rato con "bad file descriptor" y despues aparece en el cliente el mensaje. Y ademas la concurrencia no funciona. 

Os dejo los codigos...

servidor.cpp

int main(void) {
	
	int sock;
	int sock_dialog;
	struct sockaddr_in dir_ser; 
	struct sockaddr_in dir_cli;
	int numbytes;// numbytes2;
	int yes=1;// conectado=0;
	socklen_t len;
	char buf[TAMBUF];
	//char buf2[TAMBUF];
	
	
	sock = socket(PF_INET, SOCK_STREAM,0);
	if (sock < 0)
	{
		perror("error de creación de socket");
		//exit(1);
	}
	else
	{
		puts("socket creado...");
	}
	
	dir_ser.sin_family = PF_INET;
	dir_ser.sin_addr.s_addr = htonl (INADDR_ANY);
	dir_ser.sin_port = htons (PORT);	
	memset(dir_ser.sin_zero, '\0', sizeof dir_ser.sin_zero);
	
	if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)
	{
		perror("setsockopt");
		//exit(1);
	}
	
	if (bind(sock, (struct sockaddr *)&dir_ser,sizeof dir_ser)< 0)
	{
		perror("error en la asignación de dirección");
		//exit(1);
	}
	else
	{
		puts("asignando direccion...");
	}
	
	if (listen (sock, NUM_CON) < 0)
	{
		perror("error en la escucha");
		//exit(1);
	}else
		puts("socket a la escucha...");
	
	while(1)
	{
		len = sizeof dir_ser;
		sock_dialog = accept(sock, (struct sockaddr *) &dir_cli, &len);
		if (!fork())
		{
			shutdown(sock,2);
			strcpy(buf, "respuesta desde servidor...");
			numbytes = send (sock_dialog, buf, sizeof(buf), 0);
			if (numbytes < 0)
			{
				perror("error en la transmision de datos...");
			}
			//tramitarChat((struct sockaddr_in *)sock_dialog);
		}
		shutdown(sock_dialog,2);
	}
}

cliente.cpp

int main (int argc, char *argv[])
{
	int sock, i;
	struct sockaddr_in dir_serv;
	char buf[TAMBUF];
	
	sock = socket (PF_INET, SOCK_STREAM, 0);
	if (sock < 0)
	{
		perror("No se ha podido crear el socket");
		exit (-1);
	}else
		puts ("socket creado...");
	
	dir_serv.sin_family = PF_INET;
	dir_serv.sin_port = htons (PORT);
	inet_aton(argv[1], &(dir_serv.sin_addr)); 
	memset(dir_serv.sin_zero, '\0', sizeof dir_serv.sin_zero);
	
	if (connect (sock, (struct sockaddr*)&dir_serv, sizeof dir_serv) <0)
	{
		perror("conexión no aceptada");
		exit(-1);
	}else
		puts("conectando con el servidor...");
	
	i = recv (sock, buf, sizeof(buf),0);
	puts(buf);
	shutdown(sock,2);	
} 

gracias por vuestra colaboracion

nere


Más información sobre la lista de distribución Cconclase