UTNianos

Versión completa: Segundo parcial Info I (final)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, les tiro la parte practica de lo que fue mi segundo parcial, el profesor dijo que supuestamente estaria en condiciones de dar final aprobando este parcial, ya que es muy integrador.
Si me dan una mano con esto se los agredeceria infinitamente.
A mi mas que nada me mareo un poco el tema de ir encolando en una lista y guardarlo en un archivo, es decir me complico como integrarlo todo en un mismo programa.
Saludos!
Lo hice. Esta hecho medio a lo bestia pero funciona. Obviamente necesitas un archivo que actúe de cliente.
salu2.



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>

#define PORT 3550
#define BACKLOG 2

typedef struct clientes
{
char codigo[9];
int flag;

struct clientes *sig;
}CLIENTE;

typedef struct info
{
CLIENTE *inicio;
CLIENTE *fin;
}INFO;

int Conectar ();
int Aceptar (int);
int Crear (INFO *, char *);
void Agregar (INFO *, CLIENTE *);
void Guardar (INFO *);

int main (void)
{
int x=0;
int fd, fd2;
int flag=0;
char buf[100];

INFO Lista;
Lista.inicio = NULL;
Lista.fin = NULL;

fd = Conectar();
do{
fd2 = Aceptar(fd);
read (fd2, buf, sizeof(buf));
x = Crear (&Lista, buf);
close(fd2);
}while(x!=1);
Guardar(&Lista);

close(fd);
}

int Conectar()
{
int fd;
struct sockaddr_in server;

server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = INADDR_ANY;
bzero (&(server.sin_zero), 8);

fd = socket (AF_INET, SOCK_STREAM, 0);
bind (fd, (struct sockaddr *)&server, sizeof(struct sockaddr));
listen (fd, BACKLOG);

return fd;
}

int Aceptar (int fd)
{
int fd2;
int sin_size;
struct sockaddr_in cliente;

sin_size = sizeof(struct sockaddr);

printf ("Esperando conexion...\n");
fd2 = accept(fd, (struct sockaddr *)&cliente, &sin_size);
printf ("Conexion exitosa\n");

return fd2;
}

int Crear (INFO *Lista, char *buf)
{
CLIENTE *nuevo;
nuevo = malloc(sizeof(CLIENTE));

printf ("Buffer: %s\n", buf);
if (nuevo!=NULL)
{
nuevo->sig = NULL;

strcpy(nuevo->codigo, strtok(buf, ","));
nuevo->flag = atoi(strtok(NULL, "\n"));

if (strcmp(nuevo->codigo, "FFFFFFFF") != 0)
{
Agregar(Lista, nuevo);
}
else
{
free(nuevo);
return 1;
}
}
else
{
printf ("ERROR: No hay memoria\n");
}
}

void Agregar (INFO *Lista, CLIENTE *nuevo)
{
if (Lista->inicio==NULL && Lista->fin==NULL)
{
Lista->inicio = nuevo;
Lista->fin = nuevo;
}
else
{
Lista->fin->sig = nuevo;
Lista->fin = nuevo;
}
}

void Guardar (INFO *Lista)
{
CLIENTE *aux;

FILE *file;
//file = fopen ("/home/casa_inteligente/comandos.txt", "w");
file = fopen ("comandos.txt", "w");

for (aux=Lista->inicio; aux!=NULL; aux=aux->sig)
{
fprintf (file, "%s,", aux->codigo);
fprintf (file, "%d\n", aux->flag);
}
}


Buenisimo! me viene al pelo, una consulta igual, en la funcion agregar no estas haciendo una pila? no deberias agregar al final? o estoy equivocado? saludos!
Tenés razón, ya cambie las lineas 126 y 127 para que sea una lista y también mejore eso del socket, lo distribui en un par de funciones para que no sea tan bruto el codigo. Hay que aclarar que esto seria por cada vez que un cliente cualquiera inicia su programa para enviar los datos. Me alegra que te haya servido.
salu2.
(14-02-2013 22:29)anonimail escribió: [ -> ]Tenés razón, ya cambie las lineas 126 y 127 para que sea una lista y también mejore eso del socket, lo distribui en un par de funciones para que no sea tan bruto el codigo. Hay que aclarar que esto seria por cada vez que un cliente cualquiera inicia su programa para enviar los datos. Me alegra que te haya servido.
salu2.
Buenísimo! demasiado prolijo para mi jaja, te faltaría comprobar los errores que siempre rompen las bolas con eso jajaja.
Ahora estoy con otro parcial así integrador, si me dieras una mano con ese, el segundo punto en realidad, te estaría infinitamente agradecido, lo adjunto acá, si estas preparando final yo calculo que te va a servir también!
saludos y gracias man!


[Imagen: img072y.jpg]
http://imageshack.us/photo/my-images/560/img072y.jpg/

[Imagen: img071hi.jpg]
http://imageshack.us/photo/my-images/836/img071hi.jpg/
¿Que quiere decir con que el servidor debe ser concurrente? Se que puede ser muy colgada la pregunta pero en mi cursada tuvimos solo una clase de socket jaja.
(21-02-2013 13:10)Nigger escribió: [ -> ]¿Que quiere decir con que el servidor debe ser concurrente? Se que puede ser muy colgada la pregunta pero en mi cursada tuvimos solo una clase de socket jaja.

Basicamente que puede atender mas de un cliente a la vez, que en realidad en el ejemplo de anonimail no esta hecho creo, ya que se hace mediante un fork, que toma el fd del accept y se cierra cuando no hay mas conexiones entrantes.
No te preocupes, yo también tuve sockets en la ultima clase, a la semana me evaluaron jaja..
hola se que es re viejo este post, pero te acordas que profesor tuviste? yo tengo de profe a mariano gonzalez los viernes a la noche y no encuentro nada del segundo parcial. Gracias
Rafa, yo la cursé el año pasado con Mariano y Misael como ayudante. El segundo parcial se trataba de armar un programa que simulara un fixture y a medida que vos le cargabas los resultados de los partidos, calcular goles a favor/contra, puntos, ranking, etc. Todo esto usando listas, archivos, etc. Pero es una gran lotería Info 1 como te habrás dado cuenta.

Saludos
URLs de referencia