23/11/2013, 16:55
|
| | 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;
}
|