[mSocket] Usa los sockets de manera sencilla!
Publicado: 02 Oct 2011, 15:46
Buenas, bueno ayer se me ocurrio hacer mucho mas simple la forma de usar las api de Winsock en C++ y he hecho una clase para ello :P, la clase en si es esta:
ejemplo de uso (Conectandose a tí):
conectandote tú:
Espero que les sea útil,cualquier duda sobre su uso ya saben ;)
saludos.
Código: Seleccionar todo
///////////////////////////////////////////////////////////////////////
/// clase mSocket, usa de una manera simple las api de winsock;) ///
///////////////////////////////////////////////////////////////////////
/// v0.1 desarrollado por Drinky94 a 2 - octubre - 2011 ///
/// Puedes distribuir el código y usarlo siempre y cuando ///
/// respetes los derechos de autor :) ///
///////////////////////////////////////////////////////////////////////
class mSocket
{
private:
WSADATA wsa;
struct hostent * host;
struct sockaddr_in direc;
int estado;
public:
SOCKET sock;
int len;
int SockState; // Estado socket 1 = conectado 0 = desconectado.
int Inicializar(char * IP,int Puerto)
{ // devuelve cero si no hay error
WSAStartup(MAKEWORD(2,2),&wsa);
host = gethostbyname(IP);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock == -1)
{
return 1;
}
direc.sin_family = AF_INET;
direc.sin_port = htons(Puerto);
direc.sin_addr = *((struct in_addr *)host->h_addr);
memset(direc.sin_zero,0,8);
return 0;
}
int Conectar()
{ // devuelve 0 si no hay error
estado = connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
if (estado == -1)
{
return 1;
}
SockState = 1;
return 0;
}
int Desconectar()
{ // devuelve 0 si no hay error
if (closesocket(sock) != 0)
{
return 1;
}
SockState = 0;
return 0;
}
int Enviar(char * Datos,int tamano)
{ // si el parametro tamano se pasa como uno la función recalcula el tamaño
if (SockState != 0)
{
if (tamano == 1)
{
tamano = strlen(Datos);
}
len = send(sock,Datos,tamano,0);
if (len != tamano)
{
return 1;
}
return 0;
}
}
static DWORD WINAPI DataArribal(LPVOID lpParameter)
{
mSocket yo;
char Buffer[1024];
int len;
while (len != 0)
{
len = recv((int)lpParameter,Buffer,1023,0);
if (len != 0)
{
Buffer[len] = '\0';
// switch con buffer que es el que contiene los Datos que recibe.
/*Ejemplo:
if (lstrcmp(Buffer,"Hola") == 0)
{
MessageBoxA(0,"Hola",";)",0);
}*/
}
}
yo.SockState = 0;
return 0;
}
void * Recibir()
{
CreateThread(0,0,(LPTHREAD_START_ROUTINE)&DataArribal,(LPVOID)sock,0,0);
}
int Escuchar(int Puerto)
{
WSAStartup(MAKEWORD(2,0),&wsa);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
direc.sin_family = AF_INET;
direc.sin_addr.s_addr = INADDR_ANY;
direc.sin_port = htons(Puerto);
if (bind(sock, (SOCKADDR*)&direc, sizeof(direc)) == -1)
{
return 1;
}
if (listen(sock,1) == -1)
{
return 1;
}
len = sizeof(struct sockaddr);
sock = accept(sock,(sockaddr*)&direc,&len);
return 0;
}
};
Código: Seleccionar todo
#include <iostream>
#include <cstdlib>
#include <winsock2.h>
#include <windows.h>
#include <string.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
///////////////////////////////////////////////////////////////////////
/// clase mSocket, usa de una manera simple las api de winsock;) ///
///////////////////////////////////////////////////////////////////////
/// v0.1 desarrollado por Drinky94 a 2 - octubre - 2011 ///
/// Puedes distribuir el código y usarlo siempre y cuando ///
/// respetes los derechos de autor :) ///
///////////////////////////////////////////////////////////////////////
class mSocket
{
private:
WSADATA wsa;
struct hostent * host;
struct sockaddr_in direc;
int estado;
public:
SOCKET sock;
int len;
int SockState; // Estado socket 1 = conectado 0 = desconectado.
int Inicializar(char * IP,int Puerto)
{ // devuelve cero si no hay error
WSAStartup(MAKEWORD(2,2),&wsa);
host = gethostbyname(IP);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock == -1)
{
return 1;
}
direc.sin_family = AF_INET;
direc.sin_port = htons(Puerto);
direc.sin_addr = *((struct in_addr *)host->h_addr);
memset(direc.sin_zero,0,8);
return 0;
}
int Conectar()
{ // devuelve 0 si no hay error
estado = connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
if (estado == -1)
{
return 1;
}
SockState = 1;
return 0;
}
int Desconectar()
{ // devuelve 0 si no hay error
if (closesocket(sock) != 0)
{
return 1;
}
SockState = 0;
return 0;
}
int Enviar(char * Datos,int tamano)
{ // si el parametro tamano se pasa como uno la función recalcula el tamaño
if (SockState != 0)
{
if (tamano == 1)
{
tamano = strlen(Datos);
}
len = send(sock,Datos,tamano,0);
if (len != tamano)
{
return 1;
}
return 0;
}
}
static DWORD WINAPI DataArribal(LPVOID lpParameter)
{
mSocket yo;
char Buffer[1024];
int len;
while (len != 0)
{
len = recv((int)lpParameter,Buffer,1023,0);
if (len != 0)
{
Buffer[len] = '\0';
// switch con buffer que es el que contiene los Datos que recibe.
/*Ejemplo:
if (lstrcmp(Buffer,"Hola") == 0)
{
MessageBoxA(0,"Hola",";)",0);
}*/
}
}
yo.SockState = 0;
return 0;
}
void * Recibir()
{
CreateThread(0,0,(LPTHREAD_START_ROUTINE)&DataArribal,(LPVOID)sock,0,0);
}
int Escuchar(int Puerto)
{
WSAStartup(MAKEWORD(2,0),&wsa);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
direc.sin_family = AF_INET;
direc.sin_addr.s_addr = INADDR_ANY;
direc.sin_port = htons(Puerto);
if (bind(sock, (SOCKADDR*)&direc, sizeof(direc)) == -1)
{
return 1;
}
if (listen(sock,1) == -1)
{
return 1;
}
len = sizeof(struct sockaddr);
sock = accept(sock,(sockaddr*)&direc,&len);
return 0;
}
};
int main()
{
mSocket conexion;
conexion.Escuchar(2233);
conexion.Enviar("Hola",1);
system("PAUSE");
return 0;
}
Código: Seleccionar todo
#include <iostream>
#include <cstdlib>
#include <winsock2.h>
#include <windows.h>
#include <string.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
///////////////////////////////////////////////////////////////////////
/// clase mSocket, usa de una manera simple las api de winsock;) ///
///////////////////////////////////////////////////////////////////////
/// v0.1 desarrollado por Drinky94 a 2 - octubre - 2011 ///
/// Puedes distribuir el código y usarlo siempre y cuando ///
/// respetes los derechos de autor :) ///
///////////////////////////////////////////////////////////////////////
class mSocket
{
private:
WSADATA wsa;
struct hostent * host;
struct sockaddr_in direc;
int estado;
public:
SOCKET sock;
int len;
int SockState; // Estado socket 1 = conectado 0 = desconectado.
int Inicializar(char * IP,int Puerto)
{ // devuelve cero si no hay error
WSAStartup(MAKEWORD(2,2),&wsa);
host = gethostbyname(IP);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock == -1)
{
return 1;
}
direc.sin_family = AF_INET;
direc.sin_port = htons(Puerto);
direc.sin_addr = *((struct in_addr *)host->h_addr);
memset(direc.sin_zero,0,8);
return 0;
}
int Conectar()
{ // devuelve 0 si no hay error
estado = connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
if (estado == -1)
{
return 1;
}
SockState = 1;
return 0;
}
int Desconectar()
{ // devuelve 0 si no hay error
if (closesocket(sock) != 0)
{
return 1;
}
SockState = 0;
return 0;
}
int Enviar(char * Datos,int tamano)
{ // si el parametro tamano se pasa como uno la función recalcula el tamaño
if (SockState != 0)
{
if (tamano == 1)
{
tamano = strlen(Datos);
}
len = send(sock,Datos,tamano,0);
if (len != tamano)
{
return 1;
}
return 0;
}
}
static DWORD WINAPI DataArribal(LPVOID lpParameter)
{
mSocket yo;
char Buffer[1024];
int len;
while (len != 0)
{
len = recv((int)lpParameter,Buffer,1023,0);
if (len != 0)
{
Buffer[len] = '\0';
// switch con buffer que es el que contiene los Datos que recibe.
/*Ejemplo:
if (lstrcmp(Buffer,"Hola") == 0)
{
MessageBoxA(0,"Hola",";)",0);
}*/
}
}
yo.SockState = 0;
return 0;
}
void * Recibir()
{
CreateThread(0,0,(LPTHREAD_START_ROUTINE)&DataArribal,(LPVOID)sock,0,0);
}
int Escuchar(int Puerto)
{
WSAStartup(MAKEWORD(2,0),&wsa);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
direc.sin_family = AF_INET;
direc.sin_addr.s_addr = INADDR_ANY;
direc.sin_port = htons(Puerto);
if (bind(sock, (SOCKADDR*)&direc, sizeof(direc)) == -1)
{
return 1;
}
if (listen(sock,1) == -1)
{
return 1;
}
len = sizeof(struct sockaddr);
sock = accept(sock,(sockaddr*)&direc,&len);
return 0;
}
};
int main()
{
mSocket conexion;
conexion.Inicializar("localhost",2233);
conexion.Conectar();
conexion.Enviar("Hola",1);
conexion.Recibir();
system("PAUSE");
return 0;
}
Espero que les sea útil,cualquier duda sobre su uso ya saben ;)
saludos.