CreateThread para Servevidor en C

Iniciado por AlbertoBSD, 21 Septiembre 2016, 21:10 PM

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

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Kaxperday

#1
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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW