[Cramel] Socket.cml ~ De la librería de Cramel

Iniciado por BlackBlex, Julio 05, 2017, 09:09:31 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Les traigo este código el cual es solo una transcripción a Clase de la librería Socket que viene por defecto en Cramel


Información

  • Compatible con Cramel: 2.0.0.362



Tiene los siguientes métodos la clase SocketServer:

  • iniciar(Opcional Referencia Versión:Cadena = "2.2"):Booleano - Hace preparaciones para poder iniciar el servidor
  • escuchar(Puerto:Word, Opcional nConecciones:Entero = 255):Entero - Pone en escucha el servidor
  • aceptar(Opcional pProcThread:Entero):Entero - Acepta una conexión entrante
  • enviar(sockt:Entero, Referencia Datos:Cadena):Entero - Envia un dato a otra conexión
  • recibir(sockt:Entero, Opcional Tamaño:Entero = 1024):Cadena - Recibe un dato de otra conexión
  • detener
  • desconectar

Tiene los siguientes métodos la clase SocketClient:

  • iniciar(Opcional Referencia Versión:Cadena = "2.2"):Booleano - Hace preparaciones para poder iniciar el servidor
  • conectar(Referencia IP:Cadena, Puerto:Word):Entero - Se conecta a una dirección y puerto especifico
  • enviar(Referencia Datos:Cadena):Entero - Envía un dato
  • recibir(Opcional Tamaño:Entero = 1024):Cadena - Recibe un dato
  • detener
  • desconectar

Tiene las siguientes Propiedades:

  • IP - Devuelve la ip usada en la conexión
  • Puerto - Devuelve el puerto usado en la conexión
  • NumConexiones - Devuelve el numero máximo de conexiones permitidas
  • SocketPtr - Devuelve el puntero del socket

Para usarla solo es de Importar la librería Cramel, Socket y API (que viene por defecto en cramel); después declaramos una variable del tipo SocketServer o SocketClient y creamos el objecto.

Y es todo por el momento.

Aquí el código Socket.cml:
Código: Cramel
'/**
' * Socket
' *
' * @author  Yuki
' *
' * ==============Information==============
' *      Filename: Socket.cml
' * ---------------------------------------
'*/

Var TCP_Private_Init_Count:Byte

Clase SocketInfo,_
    sIP:Cadena,_
    sPuerto:Word,_
    sConexiones:Entero,_
    sVersión:Cadena,_
    sSocket:Entero,_
    @host:hostent,_
    @ptr:Entero,_
    i:Entero

    Sección Privada
        Proc setSIP(nuevo:Cadena)
            sIP = nuevo
        FinProc
        Proc getSIP:Cadena
            Resultado = sIP
        FinProc

        Proc setSPuerto(nuevo:Word)
            sPuerto = nuevo
        FinProc
        Proc getSPuerto:Word
            Resultado = sPuerto
        FinProc

        Proc setSConexiones(nuevo:Entero)
            sConexiones = nuevo
        FinProc
        Proc getSConexiones:Entero
            Resultado = sConexiones
        FinProc

        Proc setSVersión(nuevo:Cadena)
            sVersión = nuevo
        FinProc
        Proc getSVersión:Cadena
            Resultado = sVersión
        FinProc

        Proc setSSocket(nuevo:Entero)
            sSocket = nuevo
        FinProc
        Proc getSSocket:Entero
            Resultado = sSocket
        FinProc

    Sección Pública
        Prop IP:Cadena
            Lectura:getSIP
            Escritura:setSIP
        FinProp

        Prop Puerto:Word
            Lectura:getSPuerto
            Escritura:setSPuerto
        FinProp

        Prop NumConexiones:Entero
            Lectura:getSConexiones
            Escritura:setSConexiones
        FinProp

        Prop Versión:Cadena
            Lectura:getSVersión
            Escritura:setSVersión
        FinProp

        Prop SocketPtr:Entero
            Lectura:getSSocket
            Escritura:setSSocket
        FinProp

        Proc ObtenerIP(Referencia Dirección:Cadena):Entero[]
            i = inet_addr(Dirección)
            Si i <> SOCKET_ERROR Entonces
                ReDim Resultado,1
                Resultado[0] = i
                Salir
            SiNo
                host@ = GetHostByName(dirección)
                ReDim Resultado,host.h_length
                i = 0
                Contar i a host.h_length - 1
                    ptr@ = host.h_addr_list + (i * 4)
                    Resultado[i] = ptr
                Seguir
            FinSi
        FinProc

        Proc ConvertirIP(direccion:Entero):Cadena
            i = 0
            Mientras i < 4
                Resultado = Resultado + EntCad(direccion And 255)
                Si (i < 3) Entonces Resultado = Resultado + "."
                direccion = direccion Shr 8
                i = i + 1
            FinMientras
        FinProc

FinClase

Clase SocketServer(SocketInfo),_
    wData:WSADATA,_
    Ver:Word,_
    Info:SOCKADDR_IN,_
    Addr:SOCKADDR_IN,_
    Size:Entero
   
    Sección Pública
        Proc iniciar(Opcional Referencia Versión:Cadena = "2.2"):Booleano
            Si TCP_Private_Init_Count >= 1 Entonces Salir
            Seleccionar Versión
                Caso "2.2"
                    Ver = MakeWord(2,2)
            FinSeleccionar
            Resultado = (WSAStartup(Ver, wData) = OK)
            Si Resultado Entonces
                TCP_Private_Init_Count = TCP_Private_Init_Count + 1
                setSVersión(Versión)
            FinSi
        FinProc

        Proc escuchar(Puerto:Word, Opcional nConecciones:Entero = 255):Entero
            Resultado = socket(AF_INET,SOCK_STREAM,0)
            Si Resultado = INVALID_SOCKET Entonces Devolver 0
            Info.sin_family = AF_INET
            Info.sin_addr.s_addr = INADDR_ANY
            Info.sin_port = htons(Puerto)
            Si bind(Resultado, Info, &SOCKADDR_IN) = SOCKET_ERROR Entonces
                closesocket(Resultado)
                Devolver -1
            FinSi
            Si listen(Resultado, nConecciones) = SOCKET_ERROR Entonces
                closesocket(Resultado)
                Devolver -1
            FinSi
            setSPuerto(Puerto)
            setSConexiones(nConecciones)
            setSSocket(Resultado)
        FinProc

        Proc aceptar(Opcional pProcThread:Entero):Entero
            Si getSSocket = INVALID_SOCKET Entonces Salir
            Resultado = accept(getSSocket, Addr, &SOCKADDR_IN)
            Si Resultado = INVALID_SOCKET Entonces Devolver 0
            Si pProcThread Entonces Resultado = CreateThread(0,0,pProcThread,Resultado,0,0)
        FinProc

        Proc enviar(sockt:Entero, Referencia Datos:Cadena):Entero
            Si sockt = INVALID_SOCKET Entonces Salir
            Resultado = send(sockt, Datos@@, CadLong(Datos), 0)
        FinProc

        Proc recibir(sockt:Entero, Opcional Tamaño:Entero = 1024):Cadena
            Si sockt = INVALID_SOCKET Entonces Devolver ""
            Resultado = Espacio(Tamaño)
            Size = recv(sockt, Resultado@@, Tamaño,0)
            Si Size <> 0 Entonces
                Resultado = Parte(Resultado,1,Size)
            SiNo
                Resultado = ""
            FinSi
        FinProc

        Proc detener
            Si TCP_Private_Init_Count >= 1 Entonces TCP_Private_Init_Count = TCP_Private_Init_Count - 1
            WSACleanup
        FinProc

        Proc desconectar(sockt:Entero)
            closesocket(sockt)
        FinProc

FinClase

Clase SocketClient(SocketInfo),_
    wData:WSADATA,_
    Ver:Word,_
    Cliente:SOCKADDR_IN,_
    IPs[]:Entero,_
    i:Entero,_
    Size:Entero
   
    Sección Pública
        Proc iniciar(Opcional Referencia Versión:Cadena = "2.2"):Booleano
            Si TCP_Private_Init_Count >= 1 Entonces Salir
            Seleccionar Versión
                Caso "2.2"
                    Ver = MakeWord(2,2)
            FinSeleccionar
            Resultado = (WSAStartup(Ver,wData) = OK)
            Si Resultado Entonces
                TCP_Private_Init_Count = TCP_Private_Init_Count + 1
                setSVersión(Versión)
            FinSi
        FinProc

        Proc conectar(Referencia IP:Cadena, Puerto:Word):Entero
            Resultado = socket(AF_INET,SOCK_STREAM,0)
            Si Resultado = INVALID_SOCKET Entonces Devolver 0
            Cliente.sin_family = AF_INET
            Cliente.sin_port = htons(Puerto)
            IPs = ObtenerIP(IP)
            Contar i a (&IPs - 1)
                Cliente.sin_addr.s_addr = IPs[i]
                Si connect(Resultado, Cliente, &SOCKADDR_IN) = OK Entonces
                    setSPuerto(Puerto)
                    setSIP(IP)
                    setSSocket(Resultado)
                    Salir
                FinSi
            Seguir
            closesocket(Resultado)
            Resultado = -1
        FinProc

        Proc enviar(Referencia Datos:Cadena):Entero
            Si getSSocket = INVALID_SOCKET Entonces Salir
            Resultado = send(getSSocket, Datos@@, CadLong(Datos), 0)
        FinProc

        Proc recibir(Opcional Tamaño:Entero = 1024):Cadena
            Si getSSocket = INVALID_SOCKET Entonces Devolver ""
            Resultado = Espacio(Tamaño)
            Size = recv(getSSocket,Resultado@@,Tamaño,0)
            Si Size <> 0 Entonces
                Resultado = Parte(Resultado,1,Size)
            SiNo
                Resultado = ""
            FinSi
        FinProc

        Proc detener
            Si TCP_Private_Init_Count >= 1 Entonces TCP_Private_Init_Count = TCP_Private_Init_Count - 1
            WSACleanup
        FinProc

        Proc desconectar
            closesocket(getSSocket)
        FinProc

FinClase


Cualquier sugerencia, o error, comenten.