Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 6 Julio 2015, 15:29 pm



Título: Errores y magia en vector<> C++
Publicado por: Kaxperday 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?


Título: Re: Errores y magia en vector<> C++
Publicado por: ivancea96 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.


Título: Re: Errores y magia en vector<> C++
Publicado por: Kaxperday 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?


Título: Re: Errores y magia en vector<> C++
Publicado por: Kaxperday 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


Título: Re: Errores y magia en vector<> C++
Publicado por: ivancea96 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.


Título: Re: Errores y magia en vector<> C++
Publicado por: Kaxperday 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.


Título: Re: Errores y magia en vector<> C++
Publicado por: ivancea96 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);


Título: Re: Errores y magia en vector<> C++
Publicado por: Kaxperday en 6 Julio 2015, 18:08 pm
Dicho y hecho, gracias socio.