elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Duda sobre addrinfo en: 10 Diciembre 2015, 11:33 am
Buenas!
Estoy empezando a trabajar con sockets en Linux que emplean Ethernet, y me he encontrado con la struct addrinfo
Código:
struct addrinfo {
    int     ai_flags;
    int     ai_family;
    int     ai_socktype;
    int     ai_protocol;
    size_t  ai_addrlen;
    struct  sockaddr* ai_addr;
    char*   ai_canonname;     /* canonical name */
    struct  addrinfo* ai_next; /* this struct can form a linked list */
};

Alguien podria explicarme la utilidad y como usar esta struct y sus parametros?
Gracias de antemano!!
2  Programación / Programación C/C++ / Re: [Ayuda] Problema con cadenas de caracteres en: 7 Mayo 2015, 13:50 pm
Citar
Si mal no recuerdo, las variables en C ocupan posiciones consecutivas, por lo tanto si tienes dos cadenas, una de ellas de 3 caracteres y otra de 5 (por poner un ejemplo) te puedes encontrar con errores al sobrepasar los límites. Un ejemple si lees desde la entrada la palabra "Hola" y la guardas en la primera cadena, esta almacenara "Hol" y pasaría a la segunda, quedando esta con los caracteres que quedan por leer: {'a','\0'}. Y si por ejemplo la segunda cadena fuese un puntero los caracteres {'a','\0'} serían dos bytes seguidos que harían que el puntero apuntase a una dirección extraña (perdiendo, si lo hubiese, el contenido que tuvieses asignado dinamicamente).

Aqui puede que este la respuesta a lo que busco, la verdad es que realmente ese es el codigo entero, a excepcion de un main sencillo (que hice para probar la funcion) y las constantes simbolicas (como IPP). Muchas gracias!!
3  Programación / Programación C/C++ / [Ayuda] Problema con cadenas de caracteres en: 7 Mayo 2015, 11:05 am
Buenas! Estoy realizando un programa que simula un NAT, en concreto estoy terminando la comprobacion del fichero de entrada, que sea correcto. En principio el codigo no tiene errores, compila y casi funciona como es debido, pero una cadena de caracteres almacenada en una tabla de caracteres me esta dando problemas. Paso el codigo y gracias de antemano!

Código:
int leeFichEnt(FILE *fich)
{
  struct IP orig;
  struct IP dest;
  struct IP auxorig;
  struct IP auxdest;
  int error=0;
  //Contadores, i para la cadena completa y c para cada dato que saque
  int i;
  int c;
  //Cadena entera
  char cad[256];
  //Procedencia del paquete
  char tipo[TIPO];
  //Datos de la IP origen
  char auxori[IPP];
  int puertori;
  int tamori;
  int tamportori;
  //Datos de la IP destino
  char auxdes[IPP];
  int puertdes;
  int tamdes;
  int tamportdes;
  //Tamaño de los datos del paquete
  char tamanio[2];
  int tam;
  //Cadena auxiliar
  char *aux=NULL;
  char *datos=NULL;
  
  while(fgets(cad, 256, fich)!=NULL)
    {  
      //Hay que obtener la procedencia del paquete
      for(i=0,c=0; i<=TIPO; c++,i++)
tipo[c]=cad[i];
      printf("%s\n", tipo);
      if(strcmp(tipo,PRIVADO) && strcmp(tipo, PUBLICO))
//Hay que guardar la cadena en errores
error=1;
      else
{
 //Obtenemos el tamanio de lo que hay entre [[ ]]
 for(c=0; c<=2; c++,i++)
   tamanio[c]=cad[i];
 tam=atoi(tamanio);
 aux=(char*) calloc(tam,sizeof (char));
 datos=(char*) calloc(tam-(2*MINIP+1), sizeof(char));
 if(aux==NULL)
   {
     printf(MENS_ERR6);
     error=2;
   }
 else
   {
     //Sacamos una cadena con datos e IPs
     for(c=0; c<=tam;c++,i++)
aux[c]=cad[i];
Aqui es donde viene el problema, espero que los comentarios os dejen claro cual es el problema que tengo
Código:
              //Desde aqui! sscanf hace algo raro con tipo
     printf("%s\n", tipo);
     //Guardamos segun el dato
     sscanf(aux, "%s %s %s", auxori, auxdes, datos);
     printf("%s\n", tipo);
     //Hasta aqui! La variable tipo cambia su contenido... Por que?
Si alguien puede decirme que pasa en ese sscanf seria de gran ayuda
Código:
	      sscanf(auxori, "%d.%d.%d.%d:%d", &auxorig.d1, &auxorig.d2, &auxorig.d3, &auxorig.d4, &puertori);
     sscanf(auxdes, "%d.%d.%d.%d:%d", &auxdest.d1, &auxdest.d2, &auxdest.d3, &auxdest.d4, &puertdes);

     //Calculamos tamanio del puerto origen
     if(puertori<10)
tamportori=1;
     else if(puertori>=10 && puertori<100)
tamportori=2;
     else if(puertori>=100 && puertori<1000)
tamportori=3;
     else
tamportori=4;
     //Calculamos tamanio del puerto destino
     if(puertdes<10)
tamportdes=1;
     else if(puertdes>=10 && puertdes<100)
tamportdes=2;
     else if(puertdes>=100 && puertdes<1000)
tamportdes=3;
     else
tamportdes=4;
     //Obtenemos tamanio de las cadenas IP
     tamori=strlen(auxori)-(tamportori+1);
     tamdes=strlen(auxdes)-(tamportdes+1);
     //Comprobamos que las IP son correctas
     error=compruebaIP(&orig, auxori, puertori, tamori);
     if(error==0)
error=compruebaIP(&dest, auxdes, puertdes, tamdes);
     printf("%s %d %s %s %s\n", tipo, tam, auxori, auxdes, datos);
   }
 free(aux);
 aux=NULL;
 free(datos);
 datos=NULL;
}
    }
  return error;
}
4  Programación / Programación C/C++ / Re: [Ayuda] Fallo de estructura en: 18 Enero 2015, 20:51 pm
Ahhh ya se donde estaba el fallo!! Gracias por el comentario aberracion jajajaja no habia mejor manera de llamarlo!! el fallo es el return y la manera de inicializar la estructura leeFecha como tu has dicho
muchas gracias!
5  Programación / Programación C/C++ / [Ayuda] Fallo de estructura en: 18 Enero 2015, 17:57 pm
Buenas, alguien puede decirme el fallo de la funcion leeFecha definida en fecha.c??? El fichero es:
Código:
#include <stdio.h>

struct fecha leeFecha()
{
  printf("Introduzca la fecha en formato dd/mm/aaaa :");
  scanf("%d/%d/%d", &leeFecha.dia, &leeFecha.mes, &leeFecha.año);
}
int compruebaFecha(struct fecha*pFecha)
{
  int resul;
  int bis;
  bis = esBisiesto(*pFecha);
  switch(pFecha->mes)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      if(pFecha->dia > 31 || pFecha->dia == 0)
resul = 0;
      else
resul = 1;
      break;
    case 4:
    case 6:
    case 9:
    case 11:
      if(pFecha->dia > 30 || pFecha->dia == 0)
resul = 0;
      else
resul = 1;
      break;
    case 2:
      if (bis == 0)
if(pFecha->dia > 28 || pFecha->dia == 0)
  resul = 0;
else
  resul = 1;
      else
if(pFecha->dia > 29 || pFecha->dia == 0)
  resul = 0;
else
  resul = 1;
      break;
    default:
      resul=0;
    }
  return resul;
}
int comparaFecha(struct fecha f1, struct fecha f2)
{
  int resul;
  if(f1.año<f2.año)
    resul=1;
  else if(f1.año>f2.año)
    resul=-1;
  else if(f1.año==f2.año)
    {
      if(f1.mes<f2.mes)
resul=1;
      else if(f1.mes>f2.mes)
resul=-1;
      else if(f1.mes==f2.mes)
{
  if(f1.dia<f2.dia)
    resul=1;
  else if(f1.dia>f2.dia)
    resul=-1;
  else if(f1.dia==f2.dia)
    resul=0;
}
    }
  return resul;
}
void imprimeFecha(struct fecha f)
{
  printf("%d/%d/%d", f.dia, f.mes, f.año);
}
int esBisiesto(struct fecha f)
{
  int resul;
 
  if (0 == (f.año % 4))
    {
      if (0 == (f.año % 100))
{
  if (0 == (f.año % 400))
    resul = 1;
  else
    resul=0;
}
      else
resul = 1;
    }
  else
    resul=0;
  return resul;
}
Por si necesitais saber donde esta la llamada a la funcion os paso tambien estructura.c:
Código:
#include <stdio.h>
#include "fecha.h"
#include "fecha.c"
int main()
{
  struct fecha f1;
  struct fecha f2;
  struct fecha *pf1=NULL;
  struct fecha *pf2=NULL;
  f1 = leeFecha();
  pf1=&f1;
  if (compruebaFecha(pf1) == 0)
    printf("Formato de fecha incorrecto\n");
  else
    {
      f2 = leeFecha();
      pf2=&f2;
      if (compruebaFecha(pf2) == 0)
printf("Formato de fecha incorrecto\n");
      else
{
  if(comparaFecha(f1,f2)>0)
    {
      imprimeFecha(f1);
      printf(" es anterior a ");
      imprimeFecha(f2);
      printf("\n");
    }
  else if(comparaFecha(f1,f2)<0)
    {
      imprimeFecha(f1);
      printf(" es posterior a ");
      imprimeFecha(f2);
      printf("\n");
    }
  else if(comparaFecha(f1,f2)==0)
    {
      imprimeFecha(f1);
      printf(" es igual a ");
      imprimeFecha(f2);
      printf("\n");
    }
}
      if(esBisiesto(f1)==1 && esBisiesto(f2)==1)
printf(AMBAS_BISIESTO);
      else if(esBisiesto(f1)==1 && esBisiesto(f2)==0)
printf(PRIMERA_BISIESTO);
      else if(esBisiesto(f1)==0 && esBisiesto(f2)==1)
printf(SEGUNDA_BISIESTO);
      else if(esBisiesto(f1)==0 && esBisiesto(f2)==0)
printf(NINGUNA_BISIESTO);
    }
  return 0;
}
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines