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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Errores y magia en vector<> C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Errores y magia en vector<> C++  (Leído 2,673 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Errores y magia en vector<> C++
« en: 6 Julio 2015, 15:29 pm »

Bueno tras perder todo lo que acabo de escribir iré al grano.

Tengo una clase que contiene 2 vectores, uno contiene la lista de ips y otro la lista de macs de la red, a ips[2] le correspondería la mac macs[2]. Fácil.

Ambos vectores son de tipo u_char*. Antes que nada os dejo el codigo:

La clase es lista_usuarios:

Código
  1. class lista_usuarios
  2. {
  3. public:
  4. vector<u_char*> ips;//LA p**a *****.
  5. vector<u_char*> macs;
  6. void almacena_usuario(u_char* ip, u_char* mac);
  7. };
  8.  
  9. void lista_usuarios::almacena_usuario(u_char* ip, u_char* mac)
  10. {
  11. int cont = 0, cant = 0;//diferenciar win32 win64 if def ifndef
  12.  
  13. if (sizeof(ip) == 4 && sizeof(mac) == 4)
  14. {
  15. if (ips.size() == 1)
  16. {
  17. printf("\n");
  18. for (int k = 0; k < 4; k++)
  19. {
  20. printf("%x", ips[0][k]);
  21. }
  22. }
  23. //CLARO MISTERIOSAMENTE EL VECTOR VALE LO MISMO QUE IP NO ALMACENA UNA p**a *****
  24. for (int i = 0; i < ips.size(); i++)
  25. {
  26. for (int k = 0; k < 4; k++)
  27. {
  28. //printf("%x", ip[k]);
  29. }
  30. printf("-");
  31. for (int k = 0; k < 4; k++)
  32. {
  33. //printf("%x", ips[i][k]);
  34. }
  35. printf("\n");
  36.  
  37.  
  38. for (int j = 0; j < 4; j++)
  39. if (ip[j] == ips[i][j])
  40. cont++;
  41.  
  42.  
  43. for (int j = 0; j < 6; j++)
  44. if (mac[j] == macs[i][j])
  45. cant++;
  46. }
  47. //printf("\nCont: %d, Cant: %d\n", cont, cant);
  48. if (cont != 4 && cant != 6)
  49. {
  50. printf("entra\n\n", cont);
  51. /*for (int k = 0; k < 4; k++)
  52. {
  53. printf("%x", ip[k]);
  54. }
  55. printf(" - ");
  56. for (int k = 0; k < 6; k++)
  57. {
  58. printf("%x", mac[k]);
  59. }
  60. system("pause");*/
  61. ips.insert(ips.begin(), ip);
  62. macs.insert(macs.begin(), mac);
  63. }
  64. }
  65. }
  66.  

La llamada a la función es así:

Código:
lista.almacena_usuario(ip,mac);

Yo le paso la ip y la mac del host, ambas son u_char*.

Ahora comienza la MAGIA del programa, cuando esto:

printf("%x", ips[0][k]);

Muestra cada vez una cosa distina, es decir el vector de las ips su primer elemento (ips[0]) que contiene 4 valores u_char que corresponden a la IP, VEMOS que en cada llamada toma una IP distinta que casualmente es justo la que ha recibido, luego el vector siempre tiene 1 elemento, que es cuando cont=0 la primera vez (al no haber ips/mac entra porque no hay otra igual a la suya), si hay igual no se añade y saldría.

Salida: (muestra el contenido del primer elemento del vector de ips como vemos su valor se sobreescribe ¿porque? no lo sé)

Código:
ac1aab0-

ac1aa42-

ac1aa44-

ac1aab0-

ac1aa42-

ac1aa44-

ac1aa44-

ac1aa42-

ac1aa44-

ac1aab0-

ac1aa42-

ac1aa44-

ac1aa44-

ac1aa42-

ac1aab0-

ac1aab0-

ac1aa44-

ac1aab0-

ac1aa42-
tam: 1
ac1aa42::5c2e59caddeb

Al final muestra las IPs de la lista y su MAC asociada, en este caso 1 solo, ¿porque? porque la lista solo tiene un elemento, ¿porque? porque se sobreesribe...

DesesperanT.

OJO que si pruebo a hacer simplemente esto:
Código:
lista.ips.insert(lista.ips.end(), ip);
lista.macs.insert(lista.macs.end(), mac);

La lista me sale con 40 elementos todos iguales, a pesar de que al insertar inserto distintos elementos, ¿esto que broma es?


« Última modificación: 6 Julio 2015, 16:11 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #1 en: 6 Julio 2015, 16:33 pm »

Código
  1. ips.insert(ips.begin(), ip);
  2. macs.insert(macs.begin(), mac);

Eso, nunca, salvo que realmente lo quieras así, claro.

Estás metiendo una dirección. Esa dirección, al acabar el programa, puede desaparecer (tú sabrás qué haces con ella). Lo que has de hacer es malloc() y copiar lso bytes.


Además, te recomendaría usar push_back, para evitar tener que desplazar todo el array internamente.

Y si es posible, sería mejor que hicieras una estructura, que sea lo que guardes en el vector. En esa estructura, en constructor y destructor es donde deberías copiar y liberar memoria.


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #2 en: 6 Julio 2015, 16:49 pm »

Ooohhhhhg, está claro que esto es una chapuza:

Código
  1. vector<u_char*> ips;
  2. vector<u_char*> macs;

Ahora bien, crearé una estructura y trataré de almacenar los datos en ella creo que realmente es lo mejor (haber si me acuerdo como iba eso del next etc XD), y luego ya veré que tal me va. Y lo pondré por aquí.

¿que tal una estructura así?

Código:
struct hosts
{
u_char ip[4];
u_char mac[6];
hosts* next;
};

Es que despues de lo que he programado y que me falle al final... otra vez a cambiarlo :D :D :D :D :D :D :D

Edito: ¿No sabrás como se hacia para añadir un nuevo elemento a la lista con el malloc?
« Última modificación: 6 Julio 2015, 16:57 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #3 en: 6 Julio 2015, 17:01 pm »

Código:
struct host
{
u_char ip[4];
u_char mac[6];
host* next;
};

class lista_usuarios
{
public:
struct host *usuarios = NULL;
void insertar_host(u_char* ip, u_char* mac);
};

void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int cont = 0, cant = 0;

//diferenciar win32 win64 if def ifndef comprobar si esta corrupto
while (usuarios != NULL)
{
for (int j = 0; j < 4; j++)
if (ip[j] == usuarios->ip[j])
cont++;
for (int j = 0; j < 6; j++)
if (mac[j] == usuarios->mac[j])
cant++;
usuarios = usuarios->next;
}

if (cont != 4 && cant != 6)
{
usuarios->next = (host*)malloc(sizeof(host));
for (int j = 0; j < 4; j++)
usuarios->ip[j] = ip[j];
for (int j = 0; j < 6; j++)
usuarios->mac[j] = mac[j];
}
}

Eso tengo hasta ahora, no se si tengo bien lo de añadir nuevo host usando el malloc.

.. me sale que ha dejado de funcionar y no puedo depurarlo porque me faltan los PDBs  :-X :-X :-X
« Última modificación: 6 Julio 2015, 17:11 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #4 en: 6 Julio 2015, 17:22 pm »

Código:
struct host *usuarios = NULL;

Como dato, en C++ no necesitas poner "struct " al principio.

Puedes hacer un vector<host> o un list<host>. Ya que en la estructura hay punteros, deberías hacer constructor, constructor de copia y destructor. Si no los haces, entonces deberías hacer una list<>, ya que el vector andará copiando los elementos.

Ya que pretendes hacer una lista, pues list<host> te va a ahorrar todo lo relacionado con la lista.

Y otra cosa importante: en C++, y especialmente si usas clases y estructuras, evita usar malloc(), y usa new. Malloc solo consigue memoria. New además, llama a los constructores.

Aquí es donde te pregunto: ¿Quieres seguir con C, o con C++?

De hecho, juraría que vi en otro tema que usabas cout. Pero aquí solo veo printf. Si bien se pueden mezclar sin ningún problema, pues bueno.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #5 en: 6 Julio 2015, 17:33 pm »

Ohhhhhhhgggg, eso quiere decir que otra vez a cambiarlo todo, usaré vector<host> y a ver........ si...... lo consigo, muchas gracias.

La verdad aprendí C, no C++, sin embargo son casi iguales así que no tengo apenas problemas, otra cosa que me acuerde de C XDD

Saludos.

Edito: ¿Como insertaría la ip y la mac en la lista despues?

Edito SOLUCIONADO!!!!

Ya me muestra todas las jodidas ips y macs sin problemas de la reeed!!!.

Código
  1. void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
  2. {
  3. int cont = 0, cant = 0;
  4.  
  5. //diferenciar win32 win64 if def ifndef comprobar si esta corrupto
  6.  
  7. for (int i = 0; i < usuarios.size();i++)
  8. {
  9. for (int j = 0; j < 4; j++)
  10. if (ip[j] == usuarios[i].ip[j])
  11. cont++;
  12. for (int j = 0; j < 6; j++)
  13. if (mac[j] == usuarios[i].mac[j])
  14. cant++;
  15. }
  16.  
  17. if (cont != 4 && cant != 6)
  18. {
  19. host usuario;
  20. for (int j = 0; j < 4; j++)
  21. usuario.ip[j] = ip[j];
  22. for (int j = 0; j < 6; j++)
  23. usuario.mac[j] = mac[j];
  24. usuarios.insert(usuarios.end(), usuario);
  25. }
  26. }

Gracias socio, siempre en deuda.
« Última modificación: 6 Julio 2015, 17:48 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #6 en: 6 Julio 2015, 17:58 pm »

Como dato, puedes cambiar
Código:
usuarios.insert(usuarios.end(), usuario);
por
Código:
usuarios.push_back(usuario);
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Errores y magia en vector<> C++
« Respuesta #7 en: 6 Julio 2015, 18:08 pm »

Dicho y hecho, gracias socio.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
los sims magia potagia, magimonedas
Juegos y Consolas
blasito 1 4,548 Último mensaje 9 Octubre 2004, 09:16 am
por blasito
sims magia potagia
Juegos y Consolas
pablohurt 2 3,289 Último mensaje 12 Octubre 2004, 12:33 pm
por opertec
CyberMagick (Rituales de Magia en la red)
Foro Libre
Embusterillo de bolsillo 0 1,552 Último mensaje 13 Mayo 2010, 04:56 am
por Embusterillo de bolsillo
Errores en advertencias con cake y errores en mostrar nuevas respuestas.
Sugerencias y dudas sobre el Foro
Littlehorse 4 3,999 Último mensaje 1 Octubre 2010, 16:31 pm
por [D4N93R]
¿No creeis que se a perdido la magia de los chats?
Foro Libre
NEXUS978 4 1,939 Último mensaje 4 Septiembre 2013, 15:15 pm
por GALIZA
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines