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.