Ver Mensaje Individual
  #9  
Antiguo 06-03-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
Ando bastante liado con todo esto y por ahora tengo este codigo aunque falta por dejarlo como quiero pero poco a poco:
Código PHP:
#include <stdio.h>
#include <windows.h>

#define MAX_THREADS 2

DWORD WINAPI MyThreadFunctionLPVOID lpParam );
void ErrorHandler(LPTSTR lpszFunction);

int main(int argcchar *argv[]){

    
DWORD   dwThreadIdArray[MAX_THREADS];
    
HANDLE  hThreadArray[MAX_THREADS];
    
int i;

    for(
i=0i<MAX_THREADSi++ )
    {
        
// Creo el hilo para iniciar la ejecución en su función

        
hThreadArray[i] = CreateThread
            
NULL,                   // default security attributes
            
0,                      // use default stack size  
            
MyThreadFunction,       // thread function name
            
0,                      // argument to thread function
            
0,                      // use default creation flags 
            
&dwThreadIdArray[i]);   // returns the thread identifier

        // Compruebo el valor de retorno
        // Si CreateThread falla, termino la ejecución
        // Esto limpiará automáticamente los hilos y la memoria

        
if (hThreadArray[i] == NULL
        {
           
ErrorHandler("CreateThread");
           
ExitProcess(3);
        }
    } 
// Fin del bucle de creacion de hilos

    // Espero a que terminen todos los hilos
    
WaitForMultipleObjects(MAX_THREADShThreadArrayTRUEINFINITE);

    
// Cierro todos los handles de los hilos
    
for(i=0i<MAX_THREADSi++)
    {
        
CloseHandle(hThreadArray[i]);
    }
    
printf("Fin de recepcion de mensajes");
    
getchar();
    return (
EXIT_SUCCESS);
}

DWORD WINAPI MyThreadFunctionLPVOID lpParam 

    
HANDLE hStdout;

    
WSADATA wsaData;
    
SOCKET conn_socket,comm_socket;
    
SOCKET comunicacion;
    
struct sockaddr_in server;
    
struct sockaddr_in client;
    
struct hostent *hp;
    
int resp,stsize;
    
char RecvBuff[100];

    
//Inicializamos la DLL de sockets
    
resp=WSAStartup(MAKEWORD(1,0),&wsaData);
    if(
resp){
        
printf("Error al inicializar socket\n");
        
getchar();
        return 
resp;
    }

    
//Obtenemos la IP que usará nuestro servidor...
    // en este caso localhost indica nuestra propia máquina...
    
hp=(struct hostent *)gethostbyname("localhost");

    if(!
hp){
        
printf("No se ha encontrado servidor...\n");
        
getchar();
        
WSACleanup();
        return 
WSAGetLastError();
    }

    
// Creamos el socket...
    
conn_socket=socket(AF_INET,SOCK_STREAM0);
    if(
conn_socket==INVALID_SOCKET) {
        
printf("Error al crear socket\n");
        
getchar();
        
WSACleanup();
        return 
WSAGetLastError();
    }
  
    
memset(&server0sizeof(server)) ;
    
memcpy(&server.sin_addrhp->h_addrhp->h_length);
    
server.sin_family hp->h_addrtype;
    
server.sin_port htons(6000);

    
// Asociamos ip y puerto al socket
    
resp=bind(conn_socket, (struct sockaddr *)&serversizeof(server));
    if(
resp==SOCKET_ERROR){
        
printf("Error al asociar puerto e ip al socket\n");
        
closesocket(conn_socket);
        
WSACleanup();
        
getchar();
        return 
WSAGetLastError();
    }

    if(
listen(conn_socket1)==SOCKET_ERROR){
        
printf("Error al habilitar conexiones entrantes\n");
        
closesocket(conn_socket);
        
WSACleanup();
        
getchar();
        return 
WSAGetLastError();
    }
              
    
// Aceptamos conexiones entrantes
    
printf("Esperando conexiones entrantes... \n");
    
stsize=sizeof(struct sockaddr);
    
comm_socket=accept(conn_socket,(struct sockaddr *)&client,&stsize);
    if(
comm_socket==INVALID_SOCKET){
        
printf("Error al aceptar conexión entrante\n");
        
closesocket(conn_socket);
        
WSACleanup();
        
getchar();
        return 
WSAGetLastError();
    }
    
printf("Conexion entrante desde: %s\n"inet_ntoa(client.sin_addr));
              
    
// Como no vamos a aceptar más conexiones cerramos el socket escucha
    
closesocket(conn_socket);

    
printf("Recibiendo Mensajes... \n");
    
recv (comm_socketRecvBuffsizeof(RecvBuff), 0);
    
printf("Datos recibidos: %s \n"RecvBuff);

    
// Cerramos el socket de la comunicacion
    
closesocket(comm_socket);

    
// Cerramos liberia winsock
    
WSACleanup();
    return 
0
}

void ErrorHandler(char *lpszFunction
{
    
// Retrieve the system error message for the last-error code.

    
LPVOID lpMsgBuf;
    
LPVOID lpDisplayBuf;
    
DWORD dw GetLastError(); 

    
FormatMessage(
        
FORMAT_MESSAGE_ALLOCATE_BUFFER 
        
FORMAT_MESSAGE_FROM_SYSTEM |
        
FORMAT_MESSAGE_IGNORE_INSERTS,
        
NULL,
        
dw,
        
MAKELANGID(LANG_NEUTRALSUBLANG_DEFAULT),
        (
LPTSTR) &lpMsgBuf,
        
0NULL );

    
// Display the error message.

    
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT
        (
lstrlen((LPCTSTRlpMsgBuf) + lstrlen((LPCTSTRlpszFunction) + 40) * sizeof(TCHAR)); 
    
printf("%s failed with error %d: %s",lpszFunctiondwlpMsgBuf);
    
MessageBox(NULL, (LPCTSTRlpDisplayBufTEXT("Error"), MB_OK); 

    
// Free error-handling buffer allocations.

    
LocalFree(lpMsgBuf);
    
LocalFree(lpDisplayBuf);

La idea es que ambos procesos se conecten al servidor y envien la cadena con el pid y el tiempo de ejecucion pero me sale lo siguiente en la consola:

Código:
Esperando conexiones entrantes...
Error al asociar puerto e ip al socket
Conexion entrante desde: 127.0.0.1
Recibiendo Mensajes...
Datos recibidos: El proceso con PID: 3748 ha funcionado durante 500 milisegundos.
Y se queda esperando en:
Código PHP:
WaitForMultipleObjects(MAX_THREADShThreadArrayTRUEINFINITE); 
Si pongo que se cree un solo hilo va bien pero la idea de usar hilos es para que pueda conectar alguno mas jejeje.
¿Me pueden explicar porque me falla y que debo cambiar?

Última edición por aguml fecha: 06-03-2017 a las 12:10:57.
Responder Con Cita