Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #15  
Antiguo 07-03-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora mismo lo tengo asi y sigo teniendo algunas dudas sobre todo en como colocar el bucle del cliente ya que hice algo que creo que no es del todo correcto pero no se seguro. Ademas he colocado un comentario en la zona donde se asignan los parametros para el server en el codigo del cliente que me gustaria que me pudieses solventar.
Aqui el codigo del servidor:
Código PHP:
#include <stdio.h>
#include <string.h>
#include <windows.h>

#define MAX_THREADS 2

DWORD WINAPI ThClient(SOCKET *Sock);
void ErrorHandler(char *NameFunction);

int main(int argcchar *argv[]){

    
//Necesarias para crear los hilos
    
DWORD   dwThreadIdArray[MAX_THREADS];
    
HANDLE  hThreadArray[MAX_THREADS];
    
int i;

    
//Necesarias para crear el servidor
    
WSADATA wsaData;
    
struct sockaddr_in server,client;
    
struct hostent *hp;
    
int resp;
    
SOCKET Sock_c;  //Socket del cliente
    
SOCKET Sock_e;  //Socket de escucha del servidor
    
DWORD Port=6000;
    
int stsize;

    
//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...
    
Sock_e=socket(AF_INET,SOCK_STREAM0);
    if(
Sock_e==INVALID_SOCKET) {
        
printf("Error al crear socket\n");
        
getchar();
        
WSACleanup();
        return 
WSAGetLastError();
    }

    
memset(&server0sizeof(server)) ;
    
server.sin_family AF_INET;
    
server.sin_addr.s_addr INADDR_ANY;
    
server.sin_port htons(Port);

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

    if(
listen(Sock_e1)==SOCKET_ERROR){
        
printf("Error al habilitar conexiones entrantes\n");
        
closesocket(Sock_e);
        
WSACleanup();
        
getchar();
        return 
WSAGetLastError();
    }

    
printf("Esperando conexiones entrantes... \n");

    for(
i=0i<MAX_THREADSi++ )
    {
        
// Aceptamos conexiones entrantes
        
stsize=sizeof(struct sockaddr);
        
Sock_c=accept(Sock_e,(struct sockaddr *)&client,&stsize);
        if(
Sock_c==INVALID_SOCKET){
            
printf("Error al aceptar conexión entrante\n");
            
getchar();
            return 
WSAGetLastError();
        }
        
//printf("Conexion entrante desde: %s\n", inet_ntoa(client.sin_addr));

        // Creo el hilo para iniciar la ejecución en su función
        
hThreadArray[i] = CreateThread
            
NULL,                              // default security attributes
            
0,                                 // use default stack size
            
(LPTHREAD_START_ROUTINE)ThClient,  // thread function name
            
&Sock_c,                      // 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");
           
getchar();
           return 
3;
        }
    } 
// Fin del bucle de creacion de hilos

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

    
// Como no vamos a aceptar más conexiones cerramos el socket escucha
    
closesocket(Sock_e);

    
// Cerramos liberia winsock
    
WSACleanup();

    
// 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 ThClient(SOCKET *Sock)
{
    
char RecvBuff[100];

    
memset(RecvBuff,0,sizeof(RecvBuff));
    
recv (*SockRecvBuffsizeof(RecvBuff), 0);

    if(
strlen(RecvBuff)==0)
        
printf("El cliente se ha cerrado antes de enviar los datos\n");
    else
        
printf("%s\n"RecvBuff);

    
memset(RecvBuff,0,sizeof(RecvBuff));
    
recv (*SockRecvBuffsizeof(RecvBuff), 0);

    if(
strlen(RecvBuff)==0)
        
printf("El cliente se ha cerrado antes de enviar los datos\n");
    else
        
printf("Datos recibidos: %s \n"RecvBuff);

    
// Cerramos el socket de la comunicacion
    
closesocket(*Sock);

    return 
0;
}

void ErrorHandler(char *NameFunction)
{
    
LPVOID lpMsgBuf;
    
DWORD dw GetLastError(); 

    
// Recupero el mensaje de error del sistema para el último error ocurrido
    
FormatMessage(
        
FORMAT_MESSAGE_ALLOCATE_BUFFER |
        
FORMAT_MESSAGE_FROM_SYSTEM |
        
FORMAT_MESSAGE_IGNORE_INSERTS,
        
NULL,
        
dw,
        
MAKELANGID(LANG_NEUTRALSUBLANG_DEFAULT),
        (
LPTSTR) &lpMsgBuf,
        
0NULL );

    
// Muestro el mensaje de error
    
printf("Error: %s failed with error %d: %s",NameFunctiondwlpMsgBuf);

    
// Libero la memoria allocada
    
LocalFree(lpMsgBuf);

Aqui el codigo del cliente:
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argcchar *argv[]){

    
WSADATA wsaData;
    
SOCKET conn_socket;
    
struct sockaddr_in server;
    
struct hostent *host;
    
DWORD Port 6000;
    
int resp,salida;
    
unsigned long inicio,fin,lapso;
    
char SendBuff[100];
    
HWND windowHandle;
    
DWORD processID;

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

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

    if(!
host){
        
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)) ;
    
server.sin_family AF_INET;
    
server.sin_port   htons(Port);
    
//La siguiente linea, si no fuesen cliente y servidor en el mismo equipo
    //¿Tendria que darle la direccion ip del servidor?
    //Es que ahora mismo apunta a localhost del cliente ¿no?
    
server.sin_addr   = *((struct in_addr *)host->h_addr);

    
// Nos conectamos con el servidor...
    
printf("Conectando con el servidor\n");
    while(
connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
        
Sleep(10);

    
processID GetCurrentProcessId();
    
printf("Conexion establecida con: %s con proceso con PID %lu\n"inet_ntoa(server.sin_addr),processID);
    
sprintf(SendBuff,"Conexion establecida con: %s con proceso con PID: %lu.",inet_ntoa(*((struct in_addr *)host->h_addr)),processID);
    
send(conn_socket,SendBuff,sizeof(SendBuff),0);

    
//Obtengo el tiempo en el que inicia el proceso
    
inicio=GetTickCount();

    
//Esto lo pongo para tener una salida del proceso aleatoria
    //No es necesaria para nada pero al menos asi consigo simular
    //que el proceso hace algo mas a parte de comunicarse
    
srand(time(NULL));
    do{
        
salida rand()%1000;
        
Sleep(10);
    }while(
salida != 0);

    
//Obtengo el tiempo en que termina el proceso
    
fin=GetTickCount();

    
//Obtengo el lapso de tiempo transcurrido
    
lapso=fin-inicio;

    
//Enviamos el lapso de tiempo que transcurrio...
    
printf("Enviando lapso de tiempo... \n");
    
sprintf(SendBuff,"El proceso con PID: %lu ha funcionado durante %lu milisegundos.",processID,lapso);
    
send(conn_socket,SendBuff,sizeof(SendBuff),0);
    
printf("Lapso enviado: %lu milisegundos\n"lapso);

    
// Cerramos el socket y liberamos la DLL de sockets
    
closesocket(conn_socket);
    
WSACleanup();
    
getchar();
    return 
EXIT_SUCCESS;

Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reproductor de Musica Uso de WM_COPYDATA Arieloi2 API de Windows 1 28-05-2010 03:19:19
duda sobre dll romanuel C++ Builder 5 26-02-2008 20:58:52
Una duda sobre ADO PTW Conexión con bases de datos 1 13-04-2004 23:33:14
Duda sobre BDE vs IBX ESA Firebird e Interbase 3 04-03-2004 17:20:07
Duda sobre ADO Omar Alejandro Conexión con bases de datos 7 31-05-2003 19:52:58


La franja horaria es GMT +2. Ahora son las 16:36:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi