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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Multi-Threading con winpcap.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Multi-Threading con winpcap.  (Leído 4,542 veces)
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Multi-Threading con winpcap.
« 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.


En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #1 en: 12 Marzo 2012, 17:59 pm »

Haz intentando utilizar Pthread en vez de la API para Windows.?


En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Multi-Threading con winpcap.
« Respuesta #2 en: 12 Marzo 2012, 19:29 pm »

Para el caso es lo mismo, como debería pasarle el string al thread???
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #3 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
En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Multi-Threading con winpcap.
« Respuesta #4 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??
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #5 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!¡.
« Última modificación: 12 Marzo 2012, 20:57 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #6 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
« Última modificación: 29 Octubre 2012, 02:56 am por oPen syLar » En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #7 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!¡.
En línea

The Dark Shadow is my passion.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Multi-Threading con winpcap.
« Respuesta #8 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Multi-Threading con winpcap.
« Respuesta #9 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!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Tutorial] ¿System.Threading? ¡Cómo y Cuándo! (C#)
.NET (C#, VB.NET, ASP)
[D4N93R] 3 23,420 Último mensaje 14 Diciembre 2009, 01:04 am
por [D4N93R]
Intel Concurrent Collections o Threading Building Blocks ??
Programación General
skan 0 2,278 Último mensaje 12 Mayo 2010, 21:02 pm
por skan
[SFML 2.0] Threading or Objects.Update() ?
Programación C/C++
X3R4CK3R 0 1,821 Último mensaje 8 Agosto 2012, 19:56 pm
por X3R4CK3R
Hyper threading - ayuda (SOLUCIONADO)
Hardware
Zorronde 3 3,732 Último mensaje 5 Abril 2013, 16:32 pm
por Aprendiz-Oscuro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines