Estoy haciendo un chat con listas en C y tengo algunos problemas a la hora de insertar los datos y tal, me da violaciones de segmento cuando quiero acceder a los datos y tal.
La estructura es esta:
Código
typedef struct _ConnectedHosts { int socket; char *Alias; char *ipAddr; struct _ConnectedHosts *Next; } ConnectedHosts, *PConnectedHosts;
Para inicializar una estructura o crearla, utilizo esta funcion:
Código
PConnectedHosts CreateClient(int socket) { int addrlen; struct sockaddr_in ConnectedAddr; addrlen = sizeof(ConnectedAddr); if(getpeername(socket, (struct sockaddr *)&ConnectedAddr, &addrlen) < 0) { return NULL; } inet_ntop(AF_INET, &ConnectedAddr.sin_addr, ipAddr, INET_ADDRSTRLEN); cHosts->socket = socket; cHosts->ipAddr = ipAddr; cHosts->Next = NULL; return cHosts; }
Para añadir una estructura nueva a la lista uso esta otra:
Código
void AddClient(PConnectedHosts RemoteAddr, PConnectedHosts MainAddr) { PConnectedHosts aux = MainAddr; if(MainAddr == NULL) { MainAddr = RemoteAddr; } else { while(aux->Next != NULL) { aux = aux->Next; } aux->Next = RemoteAddr; } }
Para eliminar alguna estructura de la lista uso esta:
Código
int DeleteClient(PConnectedHosts DeleteAddr, PConnectedHosts MainAddr) { if(MainAddr == NULL || DeleteAddr == NULL) { return 1; } PConnectedHosts bAux; PConnectedHosts aux = MainAddr; PConnectedHosts aAux; while(aux != DeleteAddr) { bAux = aux; aux = aux->Next; aAux = aux->Next; } close(aux->socket); bAux->Next = aAux; return 0; }
Y luego utilizo esta funcion para saber qué cliente ha enviado los datos (ya que se trata de un chat):
Código
PConnectedHosts whatsClient(int socket, PConnectedHosts MainAddr) { PConnectedHosts aux = MainAddr; if(aux != NULL) { while(aux->Next != NULL && aux->socket != socket) { aux = aux->Next; } } return aux; }
Y aquí está el codigo del servidor:
Código
#include "WDestChat.h" int main() { int i, aux, max, cSocket, lSocket; char Buffer[1025]; struct sockaddr_in ServerAddr, ClientAddr; PConnectedHosts auxHosts = NULL; PConnectedHosts cHosts = NULL; fd_set master, temp; lSocket = CreateListenSocket(PORT, MAX, &ServerAddr); if(lSocket < 0) { PrintError("Error creating socket"); return 1; } max = lSocket + 1; FD_SET(lSocket, &temp); while(1) { master = temp; if(select(max, &master, NULL, NULL, NULL) < 0) { PrintError("Error receiving information"); return 1; } for(i = 0; i <= max; i++) { if(FD_ISSET(i, &master)) { if(i == lSocket) { cSocket = AcceptClient(lSocket, &ClientAddr); if(cSocket < 0) { PrintError("Error accepting client"); } else { if(max < cSocket) { max = cSocket + 1; } /* Creating client list */ auxHosts = CreateClient(cSocket); if(auxHosts == NULL) { PrintError("Error creating client list"); } /* receiving the alias */ recv(cSocket, auxHosts->Alias, 15, 0); /* adding client to structure */ AddClient(auxHosts, cHosts); /* adding client to socket array */ FD_SET(cSocket, &temp); } } else { aux = recv(i, Buffer, 1024, 0); if(aux == 0) { FD_CLR(i, &temp); auxHosts = whatsClient(i, cHosts); DeleteClient(auxHosts, cHosts); } else if(aux > 0) { for(aux = 0; aux < max; aux++) { if(aux == i || aux == lSocket) { continue; } else { auxHosts = whatsClient(aux, cHosts); send(aux, auxHosts->Alias, 15, 0); send(aux, Buffer, 1024, 0); } } } } } } } close(lSocket); return 0; }
Segun GDB da error en la línea 69, es decir, al intentar acceder a la posicion de memoria que contiene el alias. Me gustaría saber qué estoy haciendo mal. Al parecer a la hora de acceder a los datos accedo a posiciones erróneas.