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:
'/**
' * 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.