Página 1 de 1

[mSocket] Usa los sockets de manera sencilla!

Publicado: 02 Oct 2011, 15:46
por mDrinky
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:

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;
        }
};
ejemplo de uso (Conectandose a tí):

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;
}
conectandote tú:

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.

Re: [mSocket] Usa los sockets de manera sencilla!

Publicado: 02 Oct 2011, 20:33
por linkgl
Se agradece! Drinky ya te comenté lo que pensaba por msn! (: Saludos es bueno tener a alguien aportando por aquí.

Re: [mSocket] Usa los sockets de manera sencilla!

Publicado: 10 Oct 2011, 19:20
por BlackZeroX
Esta bueno y simple aun que le falta optimizacion ademas de que tiene por ahy una fuga de memoria en el API acept()...

Para recivir los datos puedes hacer esto:

Código: Seleccionar todo


            do
            {
                v_res = recv(  thisClass->v_socket , &v_buffer[0] , 1024 , 0 );
                if ( v_res > 0 )
                {
                    v_lenstr += v_res;
                    v_aux = (char*)realloc(v_aux, sizeof(char) * (v_lenstr+1));
                    memcpy( &v_aux[v_lenstr-v_res], &v_buffer[0] , v_res);
                }
            } while ( v_res > 0 );
            if ( v_lenstr > 0 && v_aux != NULL )
            {
                thisClass->Event_GetData ( v_aux , v_lenstr , thisClass );
                free ( v_aux );
            }

El buffer de 1024 lo puse estatico pero es mejor consultarselo al S.O.

Dulces Lunas!¡.