|
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 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
|
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! 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 //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 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: #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:#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; }
|
|
|
|
|
|
|