Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Necesito un código Escaner de Puertos en C++ usando Threads

Estas en el tema de Necesito un código Escaner de Puertos en C++ usando Threads en el foro de C/C++ en Foros del Web. Hola compañeros!! Un gusto otra vez por aquí Bueno les comento que estoy con ganas de crear un programa en C++, hasta digamos que voy ...
  #1 (permalink)  
Antiguo 26/04/2014, 00:01
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Necesito un código Escaner de Puertos en C++ usando Threads

Hola compañeros!! Un gusto otra vez por aquí

Bueno les comento que estoy con ganas de crear un programa en C++, hasta digamos que voy bien, pero me topo ahora con un inconveniente, que en realidad no les, pero por el momento si.

Lo que yo deseo es crear un Bot Escaner de Puertos en C++ para Redes IRC de chat, yo al bot lo pude hacer solo y hasta cree una función split() para poder separar palabras en una cadena string.


La conexión me sale bien, el bot entra al Servidor, se loguea y recibe la IP del usuario que conecta al chat, el tema viene a la hora de escaner ciertos puertos para determinar si el usuario tiene un X puerto abierto que es prohibido.

Estos tipo de bots son de seguridad y se utilizan para prevenir ataques masivos de clones.


Yo he podido hacer el escaner que analiza por ejemplo 10 puertos para saber si un usuario tiene algún proxy no permitido, estos puertos casi siempre son usados por proxys y utilizan las IPs proxys para entrar "camuflados" o anónimos al servidor.


El escaner escanea puerto por puerto hasta terminar con el último puerto, pero lo que yo necesito es crear una función y hacer llamadas a esa función con el valor de la IP del usuario para saber si tiene un puerto abierto, pero cláro, para poder hacer esto, voy a necesitar el uso de Threads, en Python esto es simple, podría lograrlo con:


threading.Thread(target=Escaner.Analizar()).start( )


o utilizar otra clase para lograr esto o usar la clase padre que es threading.


Pero en C++ por lo que leí es mucho más difícil o más difícil, en realidad lo quiero hacer no creo que sea algo difícil, pienso que un poco, porque el programa no tiene más que hacer que escanear puertos de IPs que van conectando al servidor


Esas IPs pueden ser cientas en cuestión de minutos, por eso necesito usar Threads, necesito que se divida por hilos los procesos para poder hacer esto posible.

Osea que por ejemplo en 3 segundos, el bot escanee 5 IPs al mismo tiempo, eso es lo que necesito.


Me encantaría que me dejaran un código de ejemplo para poder hacer esto posible, uso windows, así que utilizo la librería winsock2.


Me imagino que para el que sabe esto debe ser algo fácil o pan comido, yo seguiré intentando poder lograr esto y tratar de entender de alguna manera como hacer un código que utilice los Threads.


Desde ya les agradezco, muchas gracias a todos y que tengan buen día!!
  #2 (permalink)  
Antiguo 26/04/2014, 05:12
 
Fecha de Ingreso: abril-2014
Ubicación: Málaga, Andalucía, España
Mensajes: 7
Antigüedad: 10 años
Puntos: 2
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Hola!

La verdad es que hace mucho que no toco Threads en C++, pero tengo la documentacion de un proyecto antiguo donde los use, a ver si te sirve de algo:

CThread.h
Código C++:
Ver original
  1. class CThread
  2. {
  3. private:
  4.     HANDLE thandle;
  5.     long thid;
  6. public:
  7.     CThread();
  8.     ~CThread();
  9.     int Start(unsigned int (__stdcall *func)(void *), void * params);
  10.     HANDLE CThread::GetHandle();
  11.     void Resume();
  12.     void Pause();
  13.     void Stop();
  14. };

CThread.cpp
Código C++:
Ver original
  1. #include "CThread.h"
  2. CThread::CThread(){
  3.     this->thid = NULL;
  4. }
  5.  
  6. int CThread::Start(unsigned int (__stdcall * func)(void *), void * params)
  7. {
  8.     this->thandle = (HANDLE) _beginthreadex(NULL, 0, func, params, CREATE_SUSPENDED, &this->thid);
  9.  
  10.     if(!this->thandle)
  11.     {
  12.         return NULL;
  13.     }
  14.     return 1;
  15. }
  16.  
  17. HANDLE CThread::GetHandle(){ return this->thandle; }
  18.  
  19. void CThread::Resume(){ ResumeThread(this->thandle); }
  20. void CThread::Pause(){ SuspendThread(this->thandle); }
  21. void CThread::Stop(){ _endthreadex(this->thid); }
  22. CThread::~CThread(){ this->Stop(); CloseHandle((void*)this->thid); }

Y tal y como lo uso mas adelante es mas o menos de la siguiente forma:

Código C++:
Ver original
  1. unsigned int WINAPI callback(void * params)
  2. {
  3.     //Esta funcion se ejecutara durante la vida del hilo...
  4. }
  5.  
  6. void main()
  7. {
  8.     CThread * th = new CThread();
  9.     th->Start(callback, params);
  10.     th->Resume();
  11. }

Un saludo!

Última edición por menghi; 26/04/2014 a las 05:38 Razón: Agregar mas información
  #3 (permalink)  
Antiguo 26/04/2014, 06:06
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Tengo la impresion que el destructor tiene un bug, por llamar closehandle y pasarle el id del thread.
Hay que pasarle el handle.
__________________
Visita mi perfil en LinkedIn
  #4 (permalink)  
Antiguo 26/04/2014, 06:06
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Muchas gracias!!
Pero podrías poner un ejemplo de uso? por favor
Necesito saber como hace las llamadas a los Threads
Por ejemplo usando 3 o 4 bucles al mismo tiempo para poder ver donde se debe poner eso y como llama a los Threads.
Gracias.

PD: He usado 2 códigos de ejemplo que vi en una web, pero los 2 me dieron este error:

C:\Users\Daniel\Desktop\C++\SocketPuertos.cpp|3|fa tal error: strsafe.h: No such file or directory|

No creo que haga falta ese archivo, he visto en otros lados que no lo necesitan.

Última edición por Principe_Azul; 26/04/2014 a las 06:18
  #5 (permalink)  
Antiguo 26/04/2014, 06:22
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

.. y tengo la impresion que Stop () no detiene el thread asociado pues la mision de endthreadex es de housekeeping solamente.
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 26/04/2014, 09:22
 
Fecha de Ingreso: abril-2014
Ubicación: Málaga, Andalucía, España
Mensajes: 7
Antigüedad: 10 años
Puntos: 2
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Te pongo un ejemplo completo de como crear 3 threads que multipliquen un array de numeros por 3, 4 y 5 de forma asincrona.

He modificado un poco las clases que puse antes.

Se puede hacer mejor, pero es para que veas como funciona:

CThread.h
Código C++:
Ver original
  1. #include <Windows.h>
  2.  
  3. class CThread
  4. {
  5. private:
  6.     HANDLE hThread;
  7.     unsigned int thread_id;
  8.  
  9. public:
  10.     CThread();
  11.     ~CThread();
  12.  
  13.     int Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended);
  14.     void Resume();
  15.     void Suspend();
  16.     HANDLE GetHandle();
  17. };

CThread.cpp
Código C++:
Ver original
  1. #include "CThread.h"
  2. #include <process.h>
  3.  
  4. CThread::CThread()
  5. {
  6.     this->hThread = NULL;
  7.     this->thread_id = 0;
  8. }
  9.  
  10. CThread::~CThread()
  11. {
  12.     CloseHandle(this->hThread);
  13.     this->thread_id = 0;
  14. }
  15.  
  16. int CThread::Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended)
  17. {
  18.     if(this->hThread == NULL || this->thread_id == 0)
  19.     {
  20.         this->hThread = (void *) _beginthreadex(NULL, 0, func, params, 0, &this->thread_id);
  21.         if(suspended == false)
  22.             ResumeThread(this->hThread);
  23.         return 1;
  24.     }
  25.     return 0;
  26. }
  27.  
  28. void CThread::Resume()
  29. {
  30.     if(this->hThread)
  31.     {
  32.         ResumeThread(this->hThread);
  33.     }
  34. }
  35.  
  36. void CThread::Suspend()
  37. {
  38.     if(this->hThread)
  39.     {
  40.         SuspendThread(this->hThread);
  41.     }
  42. }
  43.  
  44. HANDLE CThread::GetHandle()
  45. {
  46.     return this->hThread;
  47. }

main.cpp
Código C++:
Ver original
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <string>
  4. #include "CThread.h"
  5.  
  6. using namespace std;
  7.  
  8. typedef struct{
  9.     string cadena;
  10.     int multiplicador;
  11. }datos;
  12.  
  13. int valores[16];
  14.  
  15. unsigned int WINAPI multiplica(void * params);
  16.  
  17. CThread hilo[3];
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.     //rellenamos el array valores para tener datos con los que trabajar:
  22.     for(int i=0;i<16;i++){ valores[i] = i; }
  23.  
  24.     //creamos tres hilos de ejecucion:
  25.     hilo[0] = CThread(); datos *dato1 = new datos; dato1->cadena = "Hilo 1"; dato1->multiplicador = 3;
  26.     hilo[0] = CThread(); datos *dato2 = new datos; dato2->cadena = "Hilo 2"; dato2->multiplicador = 4;
  27.     hilo[0] = CThread(); datos *dato3 = new datos; dato3->cadena = "Hilo 3"; dato3->multiplicador = 5;
  28.  
  29.     //ponemos a los tres hilos a trabajar
  30.    
  31.     hilo[0].Start(multiplica, dato1, false);
  32.     hilo[1].Start(multiplica, dato2, false);
  33.     hilo[2].Start(multiplica, dato3, false);
  34.  
  35.     WaitForSingleObject(hilo[0].GetHandle(), INFINITE);
  36.     WaitForSingleObject(hilo[1].GetHandle(), INFINITE);
  37.     WaitForSingleObject(hilo[2].GetHandle(), INFINITE);
  38.  
  39.     cout << "Fin" << endl;
  40.     cin.get();
  41. }
  42.  
  43. unsigned int WINAPI multiplica(void * params)
  44. {
  45.     int cursor = 0;
  46.     datos * dato = (datos *)params; //obtenemos el parametro;
  47.     while(cursor < 16)
  48.     {
  49.         int resultado = valores[cursor]*dato->multiplicador;
  50.         cout << dato->cadena << ": " << resultado << endl;
  51.         cursor++;
  52.         Sleep(1);
  53.     }
  54.     cout << dato->cadena << ": TERMINADO" << endl;
  55.     return 1;
  56. }

Al ejecutarlo devuelve algo como esto:

Código C++:
Ver original
  1. Hilo 1: Hilo 2: 0
  2. Hilo 2: 4
  3. 0
  4. Hilo 3: 0
  5. Hilo 2: 8
  6. Hilo 3: Hilo 2: 12
  7. 5
  8. Hilo 1: Hilo 2: 16
  9. Hilo 3: 10
  10. 3
  11. Hilo 2: 20
  12. Hilo 2: 24
  13. Hilo 3: 15
  14. Hilo 1: 6
  15. Hilo 2: 28
  16. Hilo 2: 32
  17. Hilo 3: 20
  18. Hilo 1: 9
  19. Hilo 2: 36
  20. Hilo 1Hilo 2: 40
  21. : 12
  22. Hilo 3Hilo 2: 44
  23. : 25
  24. Hilo 2: 48
  25. Hilo 1: 15
  26. Hilo 3: 30
  27. Hilo 1: 18
  28. Hilo 3: 35
  29. Hilo 1: 21
  30. Hilo 1: 24
  31. Hilo 2: 52
  32. Hilo 3: 40
  33. Hilo 2: 56
  34. Hilo 3: 45
  35. Hilo 2: 60
  36. Hilo 3: 50
  37. Hilo 2: TERMINADO
  38. Hilo 1: 27
  39. Hilo 3: 55
  40. Hilo 1: 30
  41. Hilo 3: 60
  42. Hilo 1: 33
  43. Hilo 3: 65
  44. Hilo 1: 36
  45. Hilo 3: 70
  46. Hilo 1: 39
  47. Hilo 3: 75
  48. Hilo 1: 42
  49. Hilo 3: TERMINADO
  50. Hilo 1: 45
  51. Hilo 1: TERMINADO
  52. Fin

Como ves al principio, las salidas por consola se mezclan un poco, esto es porque dentro del thread habrá que usar un mecanismo de mutex o semaforos, supongo.

Un saludo!!
  #7 (permalink)  
Antiguo 27/04/2014, 01:11
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Hola amigo, muchas gracias por el código!!
Intenté compilarlo al main.cpp, pero me dió estos errores:

mingw32-g++.exe -c C:\Users\Daniel\Desktop\C++\main.cpp -o C:\Users\Daniel\Desktop\C++\main.o
mingw32-g++.exe -o C:\Users\Daniel\Desktop\C++\main.exe C:\Users\Daniel\Desktop\C++\main.o -lws2_32
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x8e): undefined reference to `CThread::CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0xa8): undefined reference to `CThread::~CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0xfb): undefined reference to `CThread::CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x115): undefined reference to `CThread::~CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x171): undefined reference to `CThread::CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x18b): undefined reference to `CThread::~CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x1fd): undefined reference to `CThread::Start(unsigned int (*)(void*), void*, bool)'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x220): undefined reference to `CThread::Start(unsigned int (*)(void*), void*, bool)'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x243): undefined reference to `CThread::Start(unsigned int (*)(void*), void*, bool)'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x250): undefined reference to `CThread::GetHandle()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x26d): undefined reference to `CThread::GetHandle()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x28a): undefined reference to `CThread::GetHandle()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x483): undefined reference to `CThread::~CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x519): undefined reference to `CThread::CThread()'
C:\Users\Daniel\Desktop\C++\main.o:main.cpp:(.text +0x576): undefined reference to `CThread::~CThread()'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
15 error(s), 0 warning(s) (0 minute(s), 0 second(s))


A los otros 2 archivos les puse el nombre que especificaste, pero no los compilé.
¿porque falla la compilación?

Gracias nuevamente.

SOLUCIONADO: Al toque me di cuenta del error, eso pasa porque te equivocaste en el archivo main.cpp y pusiste mal el nombre de la librería CThread, en realidad era CThread.cpp y vos pusiste CThread.h, pero la librería que carga a CThread.h es CTread.cpp, así que cambié eso y funciona perfectamente, ahora me pondré a estudiar esos mecanismos!! :D
Aunque me encantaría que comentaras un poco más los códigos asi le entenderé mejor!!!

Te agradezco enormemente amigo y espero que con los sockets funcione perfectamente!!

Última edición por Principe_Azul; 27/04/2014 a las 02:23

Etiquetas: escaner, int, programa, puertos, string, threads, usando, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.