View Single Post
  #1 (permalink)  
Old May 13th, 2002
no_escape no_escape is offline
Novicius
 
Join Date: May 13th, 2002
Posts: 2
no_escape is flying high
Default Forgot To Attach Code

Sorry about my spanish

#include <signal.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
Sorry about the spanish
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <netdb.h>
#include <sys/time.h>
#define TAMBUFFER 200

void setearnobloq (int *sock);
void llenar_estructura_select (void);
void leer_socks(void);
void conexion_entrante(void);
void tratar_datos(int ilistnum);

/*void cliente(unsigned long int *,long int *);
*/

int iconeccion;

main()
{
fd_set lectura;

int sock;
int iconectados[5];
int imayorsock;
struct sockaddr_in servidor;
struct timeval timeout;
char linea[81];
long int liescuchaport;
long int lillamaport;
unsigned long int uliip;
FILE *fp;
int iestado_sockets;

int ireuso_addr = 1;


if((fp = fopen("config.txt","r")) == NULL)
{
perror("Error al abrir el archivo de configuracion");
exit(1);
}
else
{
fgets(linea,81,fp);
uliip = inet_addr(linea);
fgets(linea,81,fp);
liescuchaport = atol(linea);
fgets(linea,81,fp);
lillamaport = atol(linea);
fclose(fp);
}

printf("\nSe ha iniciado con exito el SERVIDOR!\n");
printf("------------------------------------\n\n");

sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == -1)
{
perror("Error al abrir el Stream Socket");
close(sock);
exit(1);
}
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &ireuso_addr, sizeof (ireuso_addr));

setearnobloq(&sock);

memset((char *) &servidor, 0, sizeof(servidor));
servidor.sin_family = AF_INET;
servidor.sin_addr.s_addr = INADDR_ANY;
servidor.sin_port = htonl(liescuchaport);

if(bind (sock,(struct sockaddr *) &servidor, sizeof(servidor)) == -1)
{
perror("Error en bind");
close(sock);
exit(1);
}

if(listen(sock,5) == -1)
{
perror("Error en el listen");
close(sock);
exit(1);
}

imayorsock = sock;
memset((char *) &iconectados, 0, sizeof(iconectados));


while (1) /* Loop principal del programa (infinito) */
{
llenar_estructura_select();
timeout.tv_sec = 1;
timeout.tv_usec = 0;

iestado_sockets = select(imayorsock + 1, &lectura, NULL, NULL, &timeout);

if (iestado_sockets < 0)
{
perror("SELECT!");
exit(1);
}

if (iestado_sockets == 0)
{
printf(".");
fflush(stdout);
}
else leer_socks();
}

}

void setearnobloq (int *socket)
{
if (fcntl (*socket, F_SETFL, O_NONBLOCK) < 0)
{
perror("set non-bloquing -F_SET-");
exit(1);
}
}

void llenar_estructura_select ()
{

int sock;
fd_set lectura;
int iconectados[5];
int imayorsock;
int ilistnum;

FD_ZERO(&lectura);
FD_SET(sock, &lectura);

for (ilistnum = 0; ilistnum < 5; ilistnum++)
{
if (iconectados[ilistnum] != 0)
{
FD_SET(iconectados[ilistnum], &lectura);
if (iconectados[ilistnum] > imayorsock ) imayorsock = iconectados[ilistnum];
}
}
}

void leer_socks()
{
fd_set lectura;
int ilistnum;

int sock;
int iconectados[5];
int imayorsock;

if (FD_ISSET(sock, &lectura)) conexion_entrante();

/* Veamos que pasa con nuestros sockets */

for (ilistnum = 0; ilistnum < 5; ilistnum++)
{
if (FD_ISSET(iconectados[ilistnum], &lectura))
{
tratar_datos(ilistnum);
}
}
}

void conexion_entrante()
{
struct sockaddr_in servidor;
int ilistnum;
fd_set lectura;
int iconeccion;

int sock;
int iconectados[5];
int imayorsock;
int itam;


itam = sizeof(servidor);
iconeccion = accept(sock,(struct sockaddr *) &servidor, &itam);
if (iconeccion < 0)
{
perror("accept");
exit(1);
}

setearnobloq(&iconeccion);

for (ilistnum = 0; (ilistnum < 5) && (iconeccion != -1); ilistnum++)
{
if (iconectados[ilistnum] == 0)
{
iconectados[ilistnum] = iconeccion;
iconeccion = -1;
}

if (iconeccion != -1)
{
printf ("SERVIDOR OCUPADO, NO HAY MAS LUGAR EN LA COLA DE ENTRANTES!");
send(iconeccion, "SERVER BUSY!", 12, 0);
close(iconeccion);
}

}
}

void tratar_datos(int ilistnum)
{
fd_set lectura;

int sock;
int iconectados[5];
int imayorsock;
char cbuffer[TAMBUFFER];
char cmensaje[TAMBUFFER] = "GNUTELLA OK\n\n";

if (recv(iconectados[ilistnum],cbuffer,TAMBUFFER,0) < 0)
{ /*CONEXION PERDIDA*/
printf("\nConeccion Perdida!: FD=%d ; slot=%d\n", iconectados[ilistnum], ilistnum);
close(iconectados[ilistnum]);
iconectados[ilistnum] = 0; /*VACIO ESE SLOT*/
} else /*RECIBIMOS DATOS, DEPENDIENDO DEL PAQUETE LLAMAMOS A LA FUNCION*/
{
// si es ping, ping(), etc...
// HANDSHAKE

if((!strcmp (cbuffer,"GNUTELLA CONNECT/0.4\n\n")) ||
(!strcmp (cbuffer, "GNUTELLA CONNECT/\x30\x2e\x34\n\n")))
{
printf("Se ha recibido el GNUTELLA CONNECT\n");
if(send(iconectados[ilistnum],cmensaje,(strlen(cmensaje)+1),0) != (strlen(cmensaje)+1))
{
perror("Error al responder el pedido de conexion");
close(iconeccion);
close(sock);
exit(1);
}
printf("Se ha enviado el GNUTELLA OK\n");
}
else
{
printf("No se ha podido reconocer el GNUTELLA CONNECT en el mensaje\n");
printf("FIN DE LA TRANSMISION\n");
close(iconectados[ilistnum]);
iconectados[ilistnum] = 0;
}
// Analizamos el payload descriptor y llamamos a la funcion que lo tratara.
/* FUNCIONES QUE ENTRARAN A MEDIDA QUE AVANCEMOS EN LAS ENTREGAS
if ( cbuffer[17] == 0 ) ping();

if ( cbuffer[17] == 1) pong();

if ( cbuffer[17] == 64) push();

if ( cbuffer[17] == 128) query();

if ( cbuffer[17] == 129) queryhit();

*/
}
}


// NOTA: FALTA HACER EL HILO PARA ATENDER EL CLIENTE, QUE IRA EN LA OPCION
// WRITE DEL SELECT...LO ESTARE INVESTIGANDO

/* --------------------- FUNCION CLIENTE --------------------- */
/*
void cliente (unsigned long int *uliip, long int *liserverport)
{
struct hostent *hp;
struct sockaddr_in cliente;

char cmensaje[TAMBUFFER] = "GNUTELLA CONNECT/0.4\n\n";
char cbuffer[TAMBUFFER];
char linea[81];

int sock;

sleep(20);
printf("\nSe ha iniciado el CLIENTE\n");
printf("-------------------------\n\n");
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
perror("Error en la creacion del Socket\n");
exit(1);
}

if((hp = gethostbyaddr((char *) uliip, 4, AF_INET)) == NULL )
{
perror("Error en la direccion IP\n");
close(sock);
exit(1);
}

cliente.sin_family = AF_INET;
cliente.sin_port = htons(*liserverport);
memcpy(&cliente.sin_addr, hp->h_addr_list[0], hp->h_length);

if((connect(sock,(struct sockaddr *) &cliente, sizeof(cliente))) != 0)
{
perror("Error al conectarse, no se encuentra el servidor.\nConfigurelo en config.txt\n");
close(sock);
exit(1);
}
printf("Conexion establecida entre este cliente y el servidor\n");
if(send(sock,cmensaje,(strlen(cmensaje)+1),0) != (strlen(cmensaje)+1))
{
perror ("Error en el send()");
close(sock);
exit(1);
}
printf("Se ha enviado el GNUTELLA CONNECT\n");
if(recv(sock,cbuffer,TAMBUFFER,0) == 0) printf("Esperando una respuesta del servidor\n");
else
{
if(!strcmp (cbuffer,"GNUTELLA OK\n\n"))
printf("Se ha recibido el GNUTELLA OK del servidor\n");
else
printf("No se ha podido reconocer el GNUTELLA OK en el mensaje\n");
printf("FIN DE LA TRANSMISION\n");
}

close(sock);
}
*/
Reply With Quote