Hola, aquí les traigo la Versión 2 de mi librería de socket, aun falta agregar que tenga mas funciones pero eso depende de mi tiempo, últimamente no he tenido tiempo para nada ni siquiera para iniciar el Curso de C y menos tiempo creo que tendré si es que me voy al Servicio Militar( aunque no me guste la idea de Raparme ).


bueno aqui les dejo la libreria. cualquier duda, me preguntan nomas y si tengo tiempo respondo :)

Código: Seleccionar todo

/*
      by wyver3 or heart.of.dragon
      mail --> [email protected] 
      
      FUNCIONES PARA CREAR CLIENTE Y SERVIDOR. 
      
      Crear un Servidor :
             - int    CHARGE_DLL( void );
             - int    CREATE_SOCK( void );
             - int    ASOC_SOCK( void );
             - SOCKET LISTEN_ACEPT( void );
             
      Crear un Cliente :
            - int CHARGE_DLL( void );
            - int CREATE_SOCK( void );
            - int CONNECT_HOST( void )
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      importante : una variable "SOCKET" es igual a una variable, "unsined int" .
*/

#include <windows.h>
#include <winsock2.h>
#include <string.h>

#define ERROR_EN_CLIENTE  2 //constante que retorna una funcion, en caso de Error.
#define FUNCIONA_CLIENTE  1 //constante que retorna una funcion, en caso de ejecutarse correcamente.

//Variables Globales.
unsigned short PuertoConexion    = 80; // almacenamos el puerto de conexion.
char DireccionConectar[200]      = {'\0'}; //almacenamos la direccion a Conectar.
WSADATA wsa; //variable utilizada en funcion WSAStartup.
SOCKET sock; 
struct sockaddr_in Server;
struct sockaddr_in Cliente;
int Tam                   = 0;
struct hostent *Conect;
// < ***************************** > 

// < ** Datos de conexion del Server ** >
     //Rellenando Estructura "sockaddr_in"
     Server.sin_family      = AF_INET; //protocolo IPV4.
     Server.sin_addr.s_addr = INADDR_ANY; //Direccion por Defecto(127.0.0.1).
     Server.sin_port        = htons( PuertoConexion ); //Guardamos el Puerto.
// < ** END ** >     

// < ** Datos de conexion del Cliente ** >
    //Rellenando la Estructura 
    Cliente.sin_family = AF_INET; 
    Cliente.sin_port   = htons( PuertoConexion );
    Cliente.sin_addr   = *( ( struct in_addr * )Conect->h_addr );
// < ** END ** >


//Funcion que Carga la dll de los socket.
int CHARGE_DLL( void )
{
    if( WSAStartup( MAKEWORD(2,2) , &wsa ) != 0 )
    {
        //WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    return FUNCIONA_CLIENTE;
}

//Funcion que crea un identificador del socket a conectar.
int CREATE_SOCK( void )
{
    if( ( sock = socket( AF_INET , SOCK_STREAM , IPPROTO_TCP ) ) == INVALID_SOCKET ) 
    {
        //closesocket( sock );
        //WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    return FUNCIONA_CLIENTE;
}

int ASOC_SOCK( void )
{
       //Si no podemos Asociar nuestro socket en la maquina, retornamos el codigo de error.
     if( ( bind( sock ,(SOCKADDR *)&Server , sizeof( Server ) ) ) == SOCKET_ERROR )
     {
         //closesocket( sock );
         //WSACleanup ( );  
         return ERROR_EN_CLIENTE;
     }
     
     return FUNCIONA_CLIENTE;
}

// espera una conexion y accepta la conexion, en caso de ERROR retorna codigo de ERROR.
SOCKET LISTEN_ACEPT( void )
{
    // Espera hasta recivir alguna conexion, si hay un error retorna el codigo de ERROR.
    if( listen( sock, 1 ) != 0 )
    {
         //closesocket( sock );
         //WSACleanup ( );  
         return ERROR_EN_CLIENTE;
    }
    
    // Sacamos el Tamaño de la estructura SOCKADDR para pasarsela ACCEPT.
    Tam = sizeof( struct sockaddr );
    
    //Aceptamos la Conexion.
    sock = accept( sock ,( sockaddr* )&Server , &Tam );
    
    //En caso de error retornamos el codigo de ERROR.
    if( sock == INVALID_SOCKET )
    {
        //closesocket( sock );
        //WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    return sock;
}

//Funcion para conectar a HOST.
int CONNECT_HOST( void )
{
    Conect = gethostbyname( DireccionConectar ); //intentamos conectarnos.

    if( Conect == NULL )
    {
        //closesocket( sock );
        //WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    memset( Cliente.sin_zero , 0 , 8 );
    
    if( connect( sock, ( sockaddr * )&Cliente , sizeof( sockaddr ) ) == SOCKET_ERROR )
    {
        //closesocket( sock );
        //WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    return FUNCIONA_CLIENTE;
}

//Enviar datos a travez del Socket.
int EnvioDat( char* Datos , SOCKET sock )
{
    int TamCad = strlen( Datos ); //Sacamos el NUmero de caracteres que contiene la cadena a enviar.
    
    //Enviamos la Cadena, si no seguimos coectados, retornamos el CODIGO de ERROR.
    int Env = send( sock , Datos , TamCad , 0 );
    //Limpiamos la Cadena.
    ZeroMemory( Datos , sizeof( Datos ) );
    
    if( Env == SOCKET_ERROR )
    {
        closesocket( sock );
        WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    return FUNCIONA_CLIENTE;
}

//Recivir datos a travez del socket.
int RecivDat ( char *Datos , int TamCad , SOCKET sock )
{   
    if( ( recv( sock , Datos , TamCad , 0 ) ) == SOCKET_ERROR )
    {
        closesocket( sock );
        WSACleanup ( );  
        return ERROR_EN_CLIENTE;
    }
    
    Datos = 0;
    
    return FUNCIONA_CLIENTE;
}

//Funcion para Configurar los datos de Conexion.
void ConfigConex( int Puerto , char* Direccion )
{
     PuertoConexion = ( unsigned short )Puerto;
       
     if( Direccion != NULL )
     {
          strcpy( DireccionConectar , Direccion );
     }
}

es una libreria uni conexion pero si se cranean un poco, la pueden dejar multiconexion.


SSaludos y espero que les guste.
Gracias por traerlo, es muy interesante y ademas que esta casi que por completo explicado

Un saludo

"CUANDO el poder DEL AMOR supere EL AMOR por el poder, el MUNDO conocerá la PAZ" - Jimi Hendrix
Imagen
Responder

Volver a “Fuentes”