Hola.
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:
typedef struct _ConnectedHosts {
int socket;
char *Alias;
char *ipAddr;
struct _ConnectedHosts *Next;
} ConnectedHosts, *PConnectedHosts;
Para inicializar una estructura o crearla, utilizo esta funcion:
PConnectedHosts CreateClient(int socket) {
int addrlen;
char *ipAddr
= (char *)calloc(INET_ADDRSTRLEN
, sizeof(char)); struct sockaddr_in ConnectedAddr;
struct _ConnectedHosts
*cHosts
= (PConnectedHosts
)malloc(sizeof(ConnectedHosts
));
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
->Alias
= (char *)calloc(ALIASLEN
, sizeof(char)); cHosts->Next = NULL;
return cHosts;
}
Para añadir una estructura nueva a la lista uso esta otra:
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:
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):
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:
#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);
printf("New client connected\n"); }
}
else {
aux = recv(i, Buffer, 1024, 0);
if(aux == 0) {
printf("%d socket was closed the connection\n", i
); 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);
}
}
memset(Buffer
, '\0', sizeof(Buffer
)); }
}
}
}
}
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.