Clipper/FiveWin - Sockets

 
Vista:

Sockets

Publicado por Petitonets (2 intervenciones) el 17/08/2006 13:38:20
Estoy desarroyando un modulo para un aplicativo que requiere conexion con sockets, pero me da conection failed.

lo que hago en lineas generales es:
InetInit () --> activar compativilidad con funciones de red
oSocket := InetConnectIp(IP, Puerto) --> crear socket
(si no hay errores, que los hay,,,se crea el socket)

Y pregunta mas general,
Si yo abro un socket y envio información (InetSendAll(oSocket, Mensaje)), para recoger la informacion de vuelta (procesada) basta con alguna funcion de lectura de socket, no? (InetRecvAll (oSocket, @cMensrecivido))
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Sockets

Publicado por Gabriel Pascual (913 intervenciones) el 18/08/2006 07:02:23
No compañero, vas a 20 manzanas del desfile.

Si estas usando (x)Harbour, puedes utilizar la libreria Tip.lib, que contiene todas las funciones necesarias para trabajar con IPs.

En general la cosa va asi:

Tienes un cliente del socket, y tienes que desarrollar un servidor de socket, a menos que te vyas a conectar a un servicio que ya esté establecido, si esto es el caso, no reinventes el hilo negro, utiliza la tip.lib, ya que tiene clientes de los servicios mas populares: web, ftp, pop y smtp.

si por el contrairo estas creando tu propio servidor, con tu propio protocolo, lo primero que debes hacer es construir el socket y ponerlo a "escuchar":

FUNCTION ActivateServer()
oServer := TSOCKET():New(18500)

oServer:bAccept := {|oSockServer| oSocketCliente := TSOCKET():Accept(oSockServer:nSocket),;
oSocketCliente:bRead := {|oSocket| LeeServidor(oSocket)},;
oSocketCliente:bClose := {|oSocket| oSocket:End()},;
oSocketCliente}
oServer:Listen()
RETURN (.T.)

Esta funcion crea un socket de escucha en el servidor, el cual se activa automaticamente al momento de llamar al metodo ::Listen(), al crear el socket tienes que definir un socket temporal, y definir los bloques de codigo que van a ejecutar la fucnioens cuando leas el socket (bRead).

Vamos ahora del lado del cliente, el cliente es mas simple porque solo tienes que conectarlo al socket servidor, esta funcion realiza la magia:

FUNCTION ActivarConexion()
oSocket := TSOCKET():New(NPUERTO)
oSocket:bRead := {|oSock| AnalizaRespuesta(oSock)}
oSocket:bConnect := {|oSock,nError| cIp := GETHOSTBYNAME(CSERVER)
oSocket:Connect(cIp,NPUERTO)
RETURN (.T.)

Y listo, ahora si quieres enviar mensajes al servidor, tienes que hacerlo asi:

oSocket:SendData("getfil d:\website\htdocs\petzold.zip")

Cuanto la cadena de caracteres llegue al servidor, se dispara de manera automatica la funcion LeeServidor(), que esta en programa servidor y que puede ser algo como esto:

FUNCTION LeeServidor(oCliente)
STATIC cFileName := ""
LOCAL cLetra, aDirecto := {}, cBuffer, cNserie
cLetra := oCliente:GetData()
RETURN cLetra

En este punto lees donde lees la informacion recibida del cliente.

Para enviar informacion de vuelta al cliente, haz creado un socket temporal en el server, y ahora envias de vuelta informacion:

oCliente:SendData("ONLINE"+CRLF)

TODAS las cadenas que envies, deben llevar un CR+LF que indica fin de linea y tambien fin de mensaje IP.

Para que todos los mensajes entre los sockets funcionen, tiene que haber por lo menos una Window FORZOSAMENTE , ya que es el bucle de mensajes de la ventana el que procesa los eventos de los sockets.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Sockets

Publicado por Petitonets (2 intervenciones) el 18/08/2006 13:52:33
Hola, grácias, pero la cosa es mas simple.
Yo solo tengo que desarroyar la parte del cliente.
seria algo asi como: enviar '12' y el servidor responde '3'
Para hacer esto tan sencillo no puedo utilizar las librerias Inet del (x)Harbour?

Y la cosa está, que con el tema de sockets en general, yo en la misma funcion puedo escribir y despues de un tiempo 'prudencial' leer en el socket la respuesta del servidor (sobre el mismo socket)? o tengo que hacer algo especial, como preparar un socket de escucha en el lado del cliente?

Muchas grácias por adelantado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar