Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - mester

#21
Programación C/C++ / Re: Chat con listas en C
21 Junio 2016, 15:34 PM
Cita de: AlbertoBSD en 20 Junio 2016, 15:15 PM
Ahi esta el problema al momento que tratas de acceder a auxHosts no esta inicializado. Actualmente apunta a NULL.

Tienes que ver por que no se inicializo.

Saludos!

Ya lo he solucionado. Simplemente debía reservar memoria para cHosts, por un problema en la funcion AddClient. Bueno, ya está, gracias.
#22
Programación C/C++ / Re: Chat con listas en C
20 Junio 2016, 15:00 PM
Cita de: AlbertoBSD en 20 Junio 2016, 14:56 PM
Trata de imprimir el valor (Direccion apuntada de) de auxHosts antes del error, solo para ver que si este inicializado.

Me imprime esto:

(nil)
Violación de segmento (`core' generado)


Citar
Donde inicializas max (minusculas) No veo donde este y la otra es < o <= en el for es que no veo donde este inicializado y ni sobre que cosa estes iterando.

Saludos.

¿Qué? xd
#23
Programación C/C++ / Chat con listas en C
20 Junio 2016, 14:35 PM
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);
  free(aux->Alias);
  free(aux->ipAddr);
  free(aux);

  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) {
            printf("%s\n", Buffer);
            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.
#24
Programación C/C++ / Cifrado hash SHA1 en C
29 Mayo 2016, 17:32 PM
Hola.
Estoy intentando cifrar cadenas con el hash SHA1 pero me devuelve la cadena en binario, y la quiero en texto. Ejemplo:

#include <stdio.h>
#include <openssl/sha.h>

int main() {
  char *a = "hola";
  size_t len = sizeof(a);
  unsigned char hash[40];

  SHA1(a, len, hash);
  printf("%s\n", hash);

  return 0;
}


Y me devuelve esto:

�X�{�]�Μ(`x�;6�


Gracias de antemano
#25
Cita de: ivancea96 en 21 Mayo 2016, 13:52 PM
En cuanto al código, reorganicé para 2 cosas:
-1: poner los '\0'
-2: no anexar el espacio a las cadenas. Para eso el 'else'.

Por lo demás, estaría bien que primero calculases la cantidad de argumentos que tiene la cadena, y luego hicieras los malloc. Sinó, tendrás un montón de memoria perdida.
siii, eso ya lo tenía puesto en el codigo, es que este no lo he actualizado. A ver que te parece este:

char **GetCommand(int maxLength, int *numArgs, int *background) { /*Recibe un comando*/
 int argc, secArgc;
 char *stdBuffer = (char *)calloc(sizeof(char) * maxLength, sizeof(char) + 1);
 char **stdCommand = (char **)calloc(sizeof(char *) * (maxLength / 2) + 1, sizeof(char));

 argc = secArgc = *background = 0;
 stdCommand[argc] = (char *)calloc(sizeof(char) * (maxLength / 6), sizeof(char));

 printf("%s ", COMMAND_PROMPT);
 fgets(stdBuffer, maxLength, stdin);
 stdBuffer[strlen(stdBuffer) - 1] = '\0';

 if(!seastr("&", stdBuffer)) {
   *background = 1;
 }

 while(*stdBuffer) {
   if(*stdBuffer == '\n') {
     break;
   }

   if(*stdBuffer == ' ') {
     *stdBuffer++;
     if(*stdBuffer != '&') {
       stdBuffer[++secArgc] = '\0';
       secArgc = 0;
       stdCommand[++argc] = (char *)calloc(sizeof(char) * (maxLength / 4), sizeof(char));
     }
   }
   else {
     stdCommand[argc][secArgc++] = *stdBuffer++;
   }
 }
 *numArgs = argc;

 stdCommand[++argc] = NULL;
 stdBuffer = NULL;
 free(stdBuffer);

return stdCommand;
}


Pongo lo del & porque al ser una shell, el & indica que el proceso será ejecutado en background y tal. Y en cuanto a la funcion seastr() es una funcion propia que busca en una cadena y devuelve ciertos valores:

int seastr(const char *str1 /*word*/,
            const char *str2 /*string*/) {
/*Returns 0 if str1 is in str2*/
  if(str1 == NULL||str2 == NULL) {
    return 1;
  }

  char *cp = (char *)str2;
  char *sr, *fr;

  while(*cp) {
    sr = cp;
    fr = (char *)str1;
    while(*sr && *fr && (*sr == *fr)) {
      sr++, fr++;
    }
    if(!*fr) {
      return 0;
    }
    cp++;
  }
return 1;
}


Si ves algo que se podría mejorar de ahí, por favor, dimelo. Gracias.
#26
Vale, ya me ha quedado claro, gracias por la ayuda, camarada.
#27
Cita de: AlbertoBSD en 21 Mayo 2016, 06:04 AM
Veo que estas separando por cada espacio por que no usas strtok?

Porque prefiero usar funciones mías. Una cosa, es lo mismo si hago esto:

free(stdLine);

Que si hago esto:

for(i = 0; i < 10; i++) {
  free(stdLine[i]);
}
free(stdLine);


Y otra cosa... ¿Como puedo saber si un puntero está apuntando a alguna direccion de memoria?
Porque por ejemplo puedo declararlo pero no inicializarlo, y despues al liberarlo me da una violacion de segmento.

Gracias.
#28
Hola.
Estoy haciendo una shell y de momento va bien xd el problema surge cuando quiero liberar la variable que contiene los argumentos. Adjunto codigo:

char **GetCommand(int maxLength) { /*Recibe un comando*/
  int argc, secArgc;
  char *stdBuffer = (char *)malloc(sizeof(char) * maxLength);
  char **stdCommand = (char **)malloc(sizeof(char *) * (maxLength / 2));

  argc = secArgc = 0;
  stdCommand[argc] = (char *)malloc(sizeof(char) * (maxLength / 4));

  printf("%s ", COMMAND_PROMPT);
  fgets(stdBuffer, maxLength, stdin);
  stdBuffer[strlen(stdBuffer) - 1] = '\0';

  while(*stdBuffer) {
    if(*stdBuffer == '\n') {
      break;
    }

    if(*stdBuffer == ' ') {
      secArgc = 0;
      stdCommand[++argc] = (char *)malloc(sizeof(char) * (maxLength / 4));
    }

    stdCommand[argc][secArgc++] = *stdBuffer++;
  }
  stdBuffer = NULL;
  free(stdBuffer);

return stdCommand;
}


Con esta función se recibe un comando. Y este sería el main:

char **stdLine = NULL;

  while(stdLine = GetCommand(1024)) { /*Mientras se reciba un comando*/
    printf("%s\n", stdLine[0]);

    switch(comExecute((const char **)stdLine)) {
      case 0: break;
      case 1: perror("Can\'t execute these command\n");
      case EXIT_COMMAND: exit = 1;
    }
    if(exit) { /*Si ha escrito 'exit'*/
      break;
    }

    free(stdLine);
  }


El problema surge con el free(stdLine); que a la hora de imprimirlo se ve que se llena de basura o algo así, porque cuando se ejecuta el printf del main me saca carácteres raros al final de cadena que impiden que sea bien leida. He pensado en poner stdLine = NULL; pero lo que quiero es liberar memoria. ¿Sería lo mismo poner free(stdLine) que stdLine = NULL? Yo creo que no, pero como no me dedico a la programación profesionalmente, sino más por afición, pues no tengo mucha idea.

Gracias de antemano.
#29
Cita de: engel lex en 30 Abril 2016, 20:04 PM
Es un DDOS cuanto puede durar?  Como muuuucho una semana
Ya es una semana en la que no se han difundido esas ideas.
#30
Cita de: engel lex en 26 Abril 2016, 15:16 PM
Ufff seguro eso acaba con ellos y disuelve sus ideales...

Al menos ayuda a que no se distribuyan