Autor
|
Tema: Multi-Threading con winpcap. (Leído 4,510 veces)
|
APOKLIPTICO
Desconectado
Mensajes: 3.871
Toys in the attic.
|
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: 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.
|
|
|
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
Mensajes: 769
The Best of You..
|
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
Mensajes: 3.871
Toys in the attic.
|
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
Mensajes: 769
The Best of You..
|
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
Mensajes: 3.871
Toys in the attic.
|
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??
|
|
|
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
Mensajes: 3.158
I'Love...!¡.
|
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) 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.htmlDulces 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
Mensajes: 769
The Best of You..
|
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/E8TtXSaludos
|
|
« Ú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
Mensajes: 3.158
I'Love...!¡.
|
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡buenas! Creo que el error esta en la condicion de este if: if(hThreads[i] != NULL) WaitForSingleObject(hThreads[j], INFINITE);
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
Mensajes: 3.158
I'Love...!¡.
|
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.
|
|
|
|
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,385
|
14 Diciembre 2009, 01:04 am
por [D4N93R]
|
|
|
Intel Concurrent Collections o Threading Building Blocks ??
Programación General
|
skan
|
0
|
2,252
|
12 Mayo 2010, 21:02 pm
por skan
|
|
|
[SFML 2.0] Threading or Objects.Update() ?
Programación C/C++
|
X3R4CK3R
|
0
|
1,791
|
8 Agosto 2012, 19:56 pm
por X3R4CK3R
|
|
|
Hyper threading - ayuda (SOLUCIONADO)
Hardware
|
Zorronde
|
3
|
3,689
|
5 Abril 2013, 16:32 pm
por Aprendiz-Oscuro
|
|