Multi-Threading con winpcap.

Iniciado por APOKLIPTICO, 12 Marzo 2012, 16:49 PM

0 Miembros y 1 Visitante están viendo este tema.

APOKLIPTICO

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 (cpp) [Seleccionar]
int main(int argc, char* argv[])
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_findalldevs(&alldevs, errbuf);
    int i = 0;
    for(d=alldevs; d; d=d->next, i++);
    HANDLE *hThreads = new HANDLE[i];
    for(d=alldevs; d; d=d->next)
    {
        char *pszIname = new char[strlen(d->name)];
        ZeroMemory(pszIname, strlen(d->name));
        strcpy(pszIname, d->name);
        hThreads[i] = (HANDLE) _beginthread((void (*)(void*))HandleAdapter, 0, (void*) pszIname);
        delete pszIname;
        break;
    }
    for(int j = 0; j < i; j++)
    {
        if(hThreads[i] != NULL) WaitForSingleObject(hThreads[j], INFINITE);
        else cout << "Thread " << i << " Failed." << endl;
    }
    delete hThreads;
    pcap_freealldevs(alldevs);
    return 0;
}

int HandleAdapter(void *di)
{
    char *d = (char*) di;
    cout << d << endl;
    return 0;
}


Muchas gracias!
APOKLIPTICO.
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

Haz intentando utilizar Pthread en vez de la API para Windows.?
Siempre habra 2 verdades, la que quieres creer y la que no aceptaras

APOKLIPTICO

Para el caso es lo mismo, como debería pasarle el string al thread???
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

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
Siempre habra 2 verdades, la que quieres creer y la que no aceptaras

APOKLIPTICO

Código (cpp) [Seleccionar]
int main(int argc, char* argv[])
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_findalldevs(&alldevs, errbuf);
    int i = 0;
    for(d=alldevs; d; d=d->next, i++);
    pthread_t threads[100];
    ZeroMemory(threads, sizeof(pthread_t) * i);
    int j = 0;
    for(d=alldevs; d; d=d->next, j++)
    {
        char *pszIname = new char[strlen(d->name)];
        ZeroMemory(pszIname, strlen(d->name));
        strcpy(pszIname, d->name);
        int rc = pthread_create(&threads[j], NULL, HandleAdapter, (void*)pszIname);
        delete pszIname;
    }
    pcap_freealldevs(alldevs);
    return 0;
}

void *HandleAdapter(void *di)
{
    do rand();
    while(true);
    char *d =  (char*) &di;
    cout << &d << endl;
    pthread_exit(NULL);
}


Ahora no crashea, pero se cierra el programa...
Como puedo hacer para mantenerlo funcionando??
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

#5
Código (cpp) [Seleccionar]

        char *pszIname = new char[strlen(d->name)];
        ZeroMemory(pszIname, strlen(d->name));
        strcpy(pszIname, d->name);
       delete pszIname;


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 (cpp,4,5) [Seleccionar]


void *HandleAdapter(void *di)
{
    do rand();
    while(true);
    char *d =  (char*) di;
    cout << d << endl;
...



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!¡.
The Dark Shadow is my passion.

oPen syLar

#6
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
Siempre habra 2 verdades, la que quieres creer y la que no aceptaras

BlackZeroX

Cita de: 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...

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!¡.
The Dark Shadow is my passion.

do-while

¡buenas!

Creo que el error esta en la condicion de este if:
Código (cpp) [Seleccionar]

if(hThreads[i] != NULL) WaitForSingleObject(hThreads[j], INFINITE);


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

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

BlackZeroX

Cita de: APOKLIPTICO en 12 Marzo 2012, 20:32 PM
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!¡.
The Dark Shadow is my passion.