Ayuda con un programa en c (Violacion del segmento)

Pepe
27 de Mayo del 2010
estoy programando un servidor chat, que lo que hace basicamente es repartir los menajes que le llegan entre todos los usuarios, pero creo que tengo algun tipo de problema con la lista enlazada donde se guardan los datos de los usuarios, al ejecutar me da violación del segmento, a ver si alguien estan amable de ayudarme. Estoy desesperado ya. Gracias.


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 8000

struct elemento{
char nombre_usuario[20];
struct sockaddr_in direccion;
struct elemento *siguiente;
};

struct lista{
struct elemento *primero;
//struct elemento *ultimo;
};

void insertar (struct elemento *usuario, struct lista *l);
void insertar (struct elemento *usuario, struct lista *l){

struct elemento *aux;
usuario=(struct elemento*)malloc(sizeof(struct elemento));
if(l->primero==NULL){
l->primero=usuario;
//l->ultimo=usuario;

}else{
aux=l->primero;
while(aux->siguiente!=NULL){
aux=aux->siguiente;
}
aux->siguiente=usuario;
//l->ultimo->siguiente=usuario;
//l->ultimo=usuario;

}
}



void sacar_usuario (char paquete[], char usuario[]);
void sacar_usuario (char paquete[], char usuario[]){

int i, j=0, b=0;
bzero(usuario, sizeof(usuario));
for(i=0; i<64; i++){
if(paquete[i]==':'){
if(b==0){
b=1;
i++;
}
else b=0;
}
if(b==1){
usuario[j++]=paquete[i];
}
}
}

void mostrarlista (struct lista *l){
struct elemento *aux;
char *ip;
aux=l->primero;
while(aux!=NULL){
printf("Nombre usuario: %sn", aux->nombre_usuario);

ip=inet_ntoa(aux->direccion.sin_addr);
printf("Direccion IP: %snn", ip);
aux=NULL;
}
}

void comprobar(struct elemento *a, struct lista *l){
struct elemento *aux;
aux=(struct elemento*)malloc(sizeof(struct elemento));
aux=l->primero;
do{
printf("%s",aux->nombre_usuario);
printf("%s",a->nombre_usuario);
if(strcmp(aux->nombre_usuario, a->nombre_usuario)!=0)printf("asdfa");
else printf("bbb");
aux=aux->siguiente;
}while(aux->siguiente==NULL);
}

main(){

int sockfd, recibidos,a,i,b=0;
char paquete_recibido[64], nick[20], c[20];
struct sockaddr_in serv_chat, usuario;
struct elemento *datos;
struct elemento *aux, *aux2;
struct lista *lista1=NULL;
lista1 = (struct lista *) malloc(sizeof(struct lista));
datos = (struct elemento *) malloc(sizeof(struct elemento));
aux = (struct elemento *) malloc(sizeof(struct elemento));
sockfd=socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd==-1) perror("Error en socket");

serv_chat.sin_port=htons(PORT);
serv_chat.sin_family=AF_INET;
serv_chat.sin_addr.s_addr=htonl(INADDR_ANY);

a=bind(sockfd, (struct sockaddr*)&serv_chat, sizeof(serv_chat));
if(a==-1) perror("Error en bind");


for(;;){
bzero(paquete_recibido,sizeof(struct elemento));
bzero(nick, sizeof(nick));

recibidos=recvfrom(sockfd, paquete_recibido, sizeof(paquete_recibido), 0, (struct sockaddr*)&usuario,(int*)sizeof(usuario));
printf("asdfasdf");
printf("%s", paquete_recibido);

sacar_usuario(paquete_recibido, datos->nombre_usuario);


//lista1->primero=datos;
aux=lista1->primero;
//datos->siguiente=NULL;

//datos->nombre_usuario=&nick;
datos->direccion=usuario;
//char *ip;
//ip=inet_ntoa(datos->direccion.sin_addr);
//comprobar(datos, lista1);
//printf("la dir es: %sn", ip);

//printf("%sn",datos->nombre_usuario);

//aux->nombre_usuario=c;

//printf("%sn",aux->nombre_usuario);

do{

printf("Entra forn");

//printf("%sn", nick);

//if(strcmp(inet_ntoa(datos->direccion.sin_addr), inet_ntoa(aux->direccion.sin_addr))!=0){
printf("El usuario no esta en la listan");

insertar(datos, lista1);
//mostrarlista(lista1);
//aux->nombre_usuario=nick;
//}else{
//printf("El usuario ya esta en la listan");

//printf("%s", *aux);
//sleep(1);

//}

aux=aux->siguiente;
}while(aux->siguiente=NULL);


}




}

Un saludo.