Tema: sockets
Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/11/2013, 16:55
marcelofb
 
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 11 años, 1 mes
Puntos: 0
sockets

buenos días, este es mi debut en el foro, me especializo en java, pero en este caso mi problema es con C. Les voy a pedir ayuda con un codigo de sockets, que lo tengo distribuido en 2 archivos (cliente y servidor). La idea es ejecutar el servidor, luego 4 clientes que se conectan a ese servidor. Lo que pasa es lo siguiente, el servidor una vez conectados los 4 clientes, les envía un mensaje a cada uno, pero hay algún problema con el último cliente, ya que sale el mensaje "connection refused". Les dejo los 2 códigos, el servidor se compila con "cc servidor.c -o servidor.out" y el cliente con "gcc cliente.c -o cliente.out -lm"


Código:
SERVIDOR.C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>


#define P_SIZE sizeof(struct pmensaje)

struct pmensaje{
		int mensaje;	//tipo de operacion que debe hacer el cliente
		int idNeurona;	//identificacion del cliente
		int cOrigen;	//capa de origen del mensaje
		int cDestino;	//capa de destino del mensaje
		int nDestino;	//neurona destino
		int capa;		//nro de capa en la que estoy
		float valor;	//valor
	};



struct pcliente{
	int sd;
	struct sockaddr_in cli;
	socklen_t lon;
};


void impresiones(int opcion){
	switch (opcion){
		case 1:	printf("****************************************************************\n");
				printf("***                 SERVIDOR INICIADO                        ***\n");
				printf("****************************************************************\n");
				break;
		case 2:	printf("****************************************************************\n");
				printf("***                SERVIDOR FINALIZADO                        ***\n");
				printf("****************************************************************\n");
				break;

		default: printf("");
				break;

	}

}



int enviar(char *param, struct pmensaje *m, int puerto){
	int sd;
	socklen_t lon;
	struct sockaddr_in server;
	struct hostent *h;

	server.sin_family = AF_INET;
	server.sin_port = htons(puerto);

	if (h = gethostbyname("localhost")){
		memcpy(&server.sin_addr, h->h_addr, h->h_length);
	}else{
		printf("No se encontró %s\n", param);
	}

	sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	lon = sizeof(server);


	if(connect(sd, (struct sockaddr *)&server, lon)<0){
		perror("Connect");
		exit(-1);
	}

	send(sd, m, P_SIZE, 0);
	return 0;
}

int reenviar(int sd, char *param,struct pmensaje *m){
	int ok, d;

	switch (m->cOrigen){
		//capa origen = 1 => enviar a todos los de capa 2
		case 1: enviar(param, m, 4021);
				enviar(param, m, 4022);
				enviar(param, m, 4023);
				break;
		//capa origen = 2 => envio a capa 1 o 3 (mismo cliente)
		case 2: enviar(param, m, 4001);
				break;
		//capa origen = 3 => enviar a todos los de capa 2
		case 3: d = m->nDestino;
//				m->nDestino = 1;
				switch(d){
					case 3: enviar(param, m, 4021);
							break;
					case 4: enviar(param, m, 4022);
							break;
					case 5: enviar(param, m, 4023);
							break;
				}
		default: ok = -1;
				break;
	}
	sleep(1);
	printf("Redireccionando mensaje de capa %i a capa %i de idNeurona %i\n", m->cOrigen,m->cDestino, m->idNeurona);
	return ok;
}

int main(int argc, char *argv[]){

	int i,j;
	int pid;
	int sd;
	int sdcli;
	int clientes[10];
	char buffer[P_SIZE];
	socklen_t lon;
	struct sockaddr_in server;
	struct sockaddr_in cliente;
	struct pmensaje *mensaje;


	system("clear");
	
		argv[1] = "localhost";
	

	impresiones(1);

	server.sin_family = AF_INET;
	server.sin_port = htons(4000);
	server.sin_addr.s_addr = INADDR_ANY;

	sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if ((bind(sd, (struct sockaddr *) &server, sizeof(server)))<0){
		perror("BIND: ");
		exit(-1);
	}

	listen(sd, 100);
	i = 0;
	while (1){
			lon = sizeof(cliente);

				sdcli = accept(sd, (struct sockaddr *) &cliente, &lon);

				pid = fork();
				if (pid == 0){

					close(sd);

					recv(sdcli, buffer, P_SIZE, 0);

					mensaje = (struct pmensaje *) buffer;

					if (i<=3){
						printf("El número de clientes es %i \n*******************************\n",i+1);

					switch (i){
						case 0:	mensaje->capa = 4001;
								break;
						case 1:	mensaje->capa = 4021;
								break;
						case 2:	mensaje->capa = 4022;
								break;
						case 3:	mensaje->capa = 4023;
								break;
					}
					send(sdcli, mensaje, P_SIZE, 0);
					}
					if (i == 3){
						mensaje->mensaje = 100;
						enviar("localhost", mensaje,4001);
						enviar("localhost", mensaje,4021);
						enviar("localhost", mensaje,4022);
						enviar("localhost", mensaje,4023);
					}

					if (i > 3){
						reenviar(sd, "localhost",mensaje);
					}

					close(sdcli);

					exit(0);
				}else{
					i++;

					close(sdcli);
				}
		}


	close(sd);

return 0;
}