Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: APOKLIPTICO en 12 Marzo 2012, 16:49 pm



Título: Multi-Threading con winpcap.
Publicado por: APOKLIPTICO en 12 Marzo 2012, 16:49 pm
Hola! Estoy trabajando con winpcap, el tema es que solo permite escuchar en un solo adaptador a la vez, para resolver esto, estaba pensando en utilizar threads, cada uno con un adaptador distinto.
El tema es que no puedo pasarle correctamente el parámetro, que es un array de chars.
Probe varias combinaciones pero no puedo hacer que funcione, a ver si alguien me puede hechar una mano en esto.
Dejo el código:

Código
  1. int main(int argc, char* argv[])
  2. {
  3.    pcap_if_t *alldevs;
  4.    pcap_if_t *d;
  5.    char errbuf[PCAP_ERRBUF_SIZE];
  6.    pcap_findalldevs(&alldevs, errbuf);
  7.    int i = 0;
  8.    for(d=alldevs; d; d=d->next, i++);
  9.    HANDLE *hThreads = new HANDLE[i];
  10.    for(d=alldevs; d; d=d->next)
  11.    {
  12.        char *pszIname = new char[strlen(d->name)];
  13.        ZeroMemory(pszIname, strlen(d->name));
  14.        strcpy(pszIname, d->name);
  15.        hThreads[i] = (HANDLE) _beginthread((void (*)(void*))HandleAdapter, 0, (void*) pszIname);
  16.        delete pszIname;
  17.        break;
  18.    }
  19.    for(int j = 0; j < i; j++)
  20.    {
  21.        if(hThreads[i] != NULL) WaitForSingleObject(hThreads[j], INFINITE);
  22.        else cout << "Thread " << i << " Failed." << endl;
  23.    }
  24.    delete hThreads;
  25.    pcap_freealldevs(alldevs);
  26.    return 0;
  27. }
  28.  
  29. int HandleAdapter(void *di)
  30. {
  31.    char *d = (char*) di;
  32.    cout << d << endl;
  33.    return 0;
  34. }

Muchas gracias!
APOKLIPTICO.


Título: Re: Multi-Threading con winpcap.
Publicado por: oPen syLar en 12 Marzo 2012, 17:59 pm
Haz intentando utilizar Pthread en vez de la API para Windows.?


Título: Re: Multi-Threading con winpcap.
Publicado por: APOKLIPTICO en 12 Marzo 2012, 19:29 pm
Para el caso es lo mismo, como debería pasarle el string al thread???


Título: Re: Multi-Threading con winpcap.
Publicado por: oPen syLar en 12 Marzo 2012, 20:14 pm
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

Donde routine es tu función que quieres crear el hilo y arg (es de tipo void) serán los parámetros de routine


Título: Re: Multi-Threading con winpcap.
Publicado por: APOKLIPTICO en 12 Marzo 2012, 20:32 pm
Código
  1. int main(int argc, char* argv[])
  2. {
  3.    pcap_if_t *alldevs;
  4.    pcap_if_t *d;
  5.    char errbuf[PCAP_ERRBUF_SIZE];
  6.    pcap_findalldevs(&alldevs, errbuf);
  7.    int i = 0;
  8.    for(d=alldevs; d; d=d->next, i++);
  9.    pthread_t threads[100];
  10.    ZeroMemory(threads, sizeof(pthread_t) * i);
  11.    int j = 0;
  12.    for(d=alldevs; d; d=d->next, j++)
  13.    {
  14.        char *pszIname = new char[strlen(d->name)];
  15.        ZeroMemory(pszIname, strlen(d->name));
  16.        strcpy(pszIname, d->name);
  17.        int rc = pthread_create(&threads[j], NULL, HandleAdapter, (void*)pszIname);
  18.        delete pszIname;
  19.    }
  20.    pcap_freealldevs(alldevs);
  21.    return 0;
  22. }
  23.  
  24. void *HandleAdapter(void *di)
  25. {
  26.    do rand();
  27.    while(true);
  28.    char *d =  (char*) &di;
  29.    cout << &d << endl;
  30.    pthread_exit(NULL);
  31. }

Ahora no crashea, pero se cierra el programa...
Como puedo hacer para mantenerlo funcionando??


Título: Re: Multi-Threading con winpcap.
Publicado por: BlackZeroX en 12 Marzo 2012, 20:49 pm
Código
  1.        char *pszIname = new char[strlen(d->name)];
  2.        ZeroMemory(pszIname, strlen(d->name));
  3.        strcpy(pszIname, d->name);
  4.       delete pszIname;
  5.  

Debes sumarle un 1 a strlen(d->name) este byte mas es el byte nulo de termino de cadena...
No liberes la memoria despues de la creacion del hilo (delete), en lugar de esto usa pthread_exit(di) para que pthread_join() te retorne el puntero a esta memoria y puedas liberarla con delete tambien puedes usar pthread_detach() para que no gastes la pila de retornos d elos hilos si ocupas pthread_exit(NULL)

Código
  1.  
  2. void *HandleAdapter(void *di)
  3. {
  4.    do rand();
  5.    while(true);
  6.    char *d =  (char*) di;
  7.    cout << d << endl;
  8. ...
  9.  
  10.  

las lineas sombreadas quitalas no sirven de nada... el casting ponlo sin el signo & tal cual de lo dejo arriba.

Leete la documentacion de pthread, leete un manual de C/C++ basico... ya que por lo que veo te confundes un poco aun.

http://pubs.opengroup.org/onlinepubs/009604599/functions/pthread_detach.html

Dulces Lunas!¡.


Título: Re: Multi-Threading con winpcap.
Publicado por: oPen syLar en 12 Marzo 2012, 20:53 pm
Seguro que pthread_create() no tira un segfault.? Recuerdo que tenia que llamar a ptw32_processInitialize() antes de crear un nuevo hilo sobre MinGW...

Mmm.. Tienes funciones para la lectura de paquetes... pcap_next() o similares.?




Aca te dejo un PDF acerca de como manejar los Pthread .. Esta en español y muy detallado

http://adf.ly/E8TtX

Saludos


Título: Re: Multi-Threading con winpcap.
Publicado por: BlackZeroX en 12 Marzo 2012, 21:00 pm
Seguro que pthread_create() no tira un segfault.? Recuerdo que tenia que llamar a ptw32_processInitialize() antes de crear un nuevo hilo sobre MinGW...

De hecho si tiene su segfault y es por que hace uso de delete en la siguiente linea despues de crear el hilo y el hilo intenta acceder a la memoria ya eliminada... tambien por lo del & en el casting el parametro del proceso hijo.

Dulces Lunas!¡.


Título: Re: Multi-Threading con winpcap.
Publicado por: do-while en 12 Marzo 2012, 23:09 pm
¡buenas!

Creo que el error esta en la condicion de este if:
Código
  1. if(hThreads[i] != NULL) WaitForSingleObject(hThreads[j], INFINITE);
  2.  

i esta fuera de rango, supongo que te referirias a hThreads[j]

¡Saludos!


Título: Re: Multi-Threading con winpcap.
Publicado por: BlackZeroX en 13 Marzo 2012, 03:11 am
Ahora no crashea, pero se cierra el programa...
Como puedo hacer para mantenerlo funcionando??

no habia leido bien esto...

usa

pthread_join();

Para detener el hilo madre que creo los hijos, para que asi sigan los hijos como si nada hasta que todos terminen,

Dulces Lunas!¡.