Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 21 Septiembre 2016, 21:10 PM

Título: CreateThread para Servevidor en C
Publicado por: AlbertoBSD en 21 Septiembre 2016, 21:10 PM
Que tal Pongo aqui la solucion que encontre al problema de no tener fork en Windows, la solucion es CreateThread de la winapi



   if(listen(ListenSocket, BACKLOG) == SOCKET_ERROR) {
printf("listen failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
       return 1;
   }
while(entrar) {//Entrar es true solo se cambia por otro segmento del codigo en caso de que queramos finalizar con el hilo principal
b = sizeof(struct sockaddr_in);
client = accept(ListenSocket,(SOCKADDR *) service,&b);
if(client == INVALID_SOCKET) {
exit(1);
}
toThread = malloc(sizeof(SOCKET));
memcpy(toThread,&client,sizeof(SOCKET));// Copiamos la variable socket principal para pasarla al thread
hThread = CreateThread(
           NULL,                   // default security attributes
           0,                      // use default stack size  
           client_funtion,       // thread function name
           toThread,          // argument to thread function
           0,                      // use default creation flags
           &dwThreadId);   // returns the thread identifier
printf("Thread ID %u\n",dwThreadId);
if(hThread == NULL) {
          free(toThread);
  exit(0)
       }
}
   closesocket(ListenSocket);


hay que tener en cuenta que necesitasmos una funcion para el Thread:


DWORD WINAPI client_funtion( LPVOID lpParam ) {
//Variables
// aqui recivir datos y procesarlos, se puede llamar a otras funciones que sean Thread safe
}


Si no queremos que el hilo principal se "preocupe" por cerrar estas conexiones y terminar con el hilo podemos poner lo siguiente:

DWORD WINAPI client_funtion( LPVOID lpParam ) {
HANDLE thread_id;
thread_id = GetCurrentThread();
//Otras variables
//codigo aque para procesar al cliente correctamente

free(lpParam); //Si lpParam es un parametro que tenemos que liberar entonces Free

CloseHandle(thread_id); //Terminamos con nuestro propio Thread
}


Me base en el ejemplo puesto aqui:

http://foro.elhacker.net/programacion_cc/createthread_o_createprocess-t458039.0.html

Saludos
Título: Re: CreateThread para Servevidor en C
Publicado por: Kaxperday en 22 Septiembre 2016, 11:41 AM
Buenas Alberto,

Pues me parece que para windows la mejor opcion para lo que buscas es esa, dando por hecho que para procesar un cliente es mejor crear un thread que un proceso. Yo trabajo con C++ y en su lugar lo hago con std::thread que lo veo mas sencillo y maleable, din embargo para C no me viene ahora a la cabeza otra funcion para crear threads que esa,te recomendaría pasar a C++ XD.

Te dejo aquí un ejemplo de mi thread servidor sslstrip en C++:

Código (cpp) [Seleccionar]

void SSLStrip::Run(std::string serverIP, UINT serverPort)
{
//CookieCleaner::GetInstance()->SetEnabled(TRUE);
WSADATA wsa;
SOCKET serverSocket;
sockaddr_in serverAddr;

WSAStartup(MAKEWORD(2, 0), &wsa);
memset(&serverAddr, 0, sizeof(serverAddr));

if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
{
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
serverAddr.sin_addr.s_addr = inet_addr(serverIP.c_str());

if (::bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) != SOCKET_ERROR)
{
if (listen(serverSocket, MAXIMUM_SNIFFER_VICTIMS) != SOCKET_ERROR)
{
SOCKET victimSocket;
sockaddr_in victimAddr;
victimAddr.sin_family = AF_INET;
INT len = sizeof(victimAddr);

while (status != DISABLE_SSLSTRIP)
{
victimSocket = accept(serverSocket, (sockaddr*)&victimAddr, &len);

if (victimSocket != INVALID_SOCKET)
{
std::thread t(HTTPSession, victimSocket, inet_ntoa(victimAddr.sin_addr), status);
t.detach();
}
}
}
}
closesocket(serverSocket);
}

WSACleanup();
}


Ahora que me fijo creo que pondré un if en WSAStartup por si da error que no haga el bloque y meteré el WSACleanup al final del bloque del if.

Un saludo y animo.
Título: Re: CreateThread para Servevidor en C
Publicado por: AlbertoBSD en 22 Septiembre 2016, 16:22 PM
Pues en teoria estoy creando un thread y no un proceso hay una funcion en windows que hace precisamente eso (CreateProcess) el tema lo trate aqui:

https://foro.elhacker.net/programacion_cc/createthread_o_createprocess-t458039.0.html

Y si al final decidi usar los threads al estilo de windows y funciona bastante bien. ya que lo termine probare el metodo que indicas.

Saludos!