Falha de segmentacao usando Lista [RESOLVIDO]

1. Falha de segmentacao usando Lista [RESOLVIDO]

leandro de almeida
leandrojapa

(usa Debian)

Enviado em 11/04/2010 - 12:20h

Bom dia galera...to fazendo um trabalho de sockets em redes e preciso guarda os clientes conectados dentro de uma lista...mas ja estou com problemas pra manipular a propria lista...fiz uns testes na insercao de dados .mas sempre da erro de segmentacao...alguem ja passou por isso ou pode me ajudar onde estou pegando conteudo na memoria de forma errada.
muito grato.,
servidor.c
int main(int argc, char ** argv)

{
//~ int sockfd,n;
//~ pthread_t threadAccept;
//~ struct sockaddr_in * meu_end = getMeuSock(20000);
cria(listaClientes);

struct in_addr temp;

memset(&temp, 127, sizeof(struct in_addr));

adicionar(listaClientes, temp, 4);

// memset(&temp, 255, sizeof(struct in_addr));

//adicionar(listaClientes, temp, 4);

imprimeCliente(listaClientes);
return 0;

}

lista.h
struct listaSock
{
struct in_addr endereco;
int sockfd;
struct listaSock * proximo;
};

typedef struct listaSock ListaS;
int listSize = sizeof(ListaS);

ListaS *listaClientes;


void cria(ListaS* s)
{
s = meuMalloc(sizeof(struct listaSock));
s->proximo = NULL;
}

/*estrutura para adicionar a lista*/
void adicionar(ListaS *s, struct in_addr end, int sockd)
{
ListaS *novo;
novo = meuMalloc(listSize);
novo->endereco = end;
novo->sockfd = sockd;

novo->proximo = s->proximo;
s->proximo = novo;
}

void imprimeCliente (ListaS *ini)
{
ListaS *p;
for (p = ini->proximo; p != NULL; p = p->proximo)
printf ("%s\n", inet_ntoa(p->endereco));
//printf("teste");
}

void *meuMalloc(unsigned int nbytes)
{
void *ptr;
ptr = malloc(nbytes);
if (ptr == NULL)
{
printf ("\nErro no Malloc\n");
exit(EXIT_FAILURE);
}
return ptr;
}





  


2. Re: Falha de segmentacao usando Lista [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 11/04/2010 - 13:40h

Tipo, ali na sua função void cria(ListaS* s), o parâmetro s recebe
o endereço apontado por listaClientes, depois s aponta para o endereço retornado por malloc.
Com isso, listaClientes estará apontando para o endereço anterior (não o retornado por malloc).

Uma dica seria a função criar retornar o endereço dado por malloc para a variável ponteiro ListaS *s. (Ou usar ponteiros para ponteiros)

Acho que é isso mas como você não postou o código todo, eu devo estar errado xD

Espero ter ajudado.
t+


3. Falha de segmentacao usando Lista

leandro de almeida
leandrojapa

(usa Debian)

Enviado em 11/04/2010 - 23:05h

entao cara, tentei fazer da forma q vc falou..mas ainda continua o erro..
será q fiz certo?poderia me mandar um exemplo de como ficaria a funcao ?
tenhoq entregar esse trabalho até quarta e estou atrasadissimo...
agradeço mto a ajuda;.
[]s


4. Re: Falha de segmentacao usando Lista [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 12/04/2010 - 09:14h

Ok! Coloque sua funcao cria para retornar o endereco dado por malloc:

ListaS* cria()
{
ListaS* s ;
s = meuMalloc(sizeof(struct listaSock));
s->proximo = NULL;

return s ;
}

Ai voce chama assim:

listaClientes = cria() ;

Tente ai e diga se funcionou!!
t+




5. Falha segmentacao Lista(Resolvido)

leandro de almeida
leandrojapa

(usa Debian)

Enviado em 12/04/2010 - 10:01h

Opa...agora funcionou!!agradeço muito a ajuda..
agora preciso quebra a cabeça para armazenar os processos rodando no cliente
em outra lista..mas isso quebro a cabeça hj..=)
vleuuu msm
[]s