Protocolo IOCP

Antes de meternos con el protocolo dejenme hacer un par de comentarios que creo convenientes. El IOCP es un protocolo TÉCNICAMENTE mejorable (y en muchas cosas), lo sabemos ya, así que nadie se apunte la idea de que lo mejoraría ;-)))) eso es fácil. Lo que no es nada fácil, y por eso no se ha hecho, es cambiar TODAS las implementaciones en los clientes y servidores que existen en la actualidad, y no estamos por la labor de cambiarlo, lo que hacemos es 'ampliarlo'. En lo que os voy a poner a continuación se entiende: un carácter entre comillas simples significa eso, un carácter, y el valor es el del carácter indicado, así ' ' es lo mismo que $20, o 32, o espacio.

NOTA: ... (tres puntos) significa, un nº indeterminado de caracteres (en orden lógico) según la trama que se está indicando.

0.- IOCP es un protocolo en modo texto, legible, no codificado.

1.- IOCP fue diseñado para UDP, NO TCP, pero IOCPServer utiliza TCP. (Véase punto 12)

2.- Está basado en una arquitectura cliente-servidor pensado para que los clientes 'se registren' y el servidor pueda saber así qué quiere cada uno, de manera que cuando algo cambia se notifica a los clientes el cambio, sin que estos pregunten.

3.- Las variables, son de tipo entero y la necesidad de tener decimales, se resuelve multiplicando el dato antes de ser transmitido y dividiendo tras recibirlo (en el cliente).

4.- Todos los mensajes de IOCP terminan con dos caracteres, el 13 y el 10. $0D y $0A, es decir la secuencia CR+LF de final de línea. En el resto de esta página lo indicaré como CL

5.- Todos los tipos de registro de IOCP comienzan con la secuencia "Arn." Los primeros 4 octetos (bytes) de cada registro son 'A','r','n', '.'

Arn.

6.- El primer mensaje se produce tras la conexión del cliente al servidor y consiste en un mensaje en el que el servidor informa al cliente 'con quien se ha conectado' para que el cliente actúe en consecuencia. Este mensaje es Arn.TipoSer:xxxxxx:CL donde xxxxxxx es el nombre del servidor.

Pj: Para el IOCPServer del FS cuando un cliente se conecta, recibe la secuencia,

Arn.TipoSer

donde la 'n' debe ser interpretada como un dígito que indica la versión del FS, así el IOCPServer 1.6 puede entregar 7, 8 y 9 en esa posición para los FS98, FS2000 y FS2004 respectivamente. Para FSX se entregará una A. Es decir: "Arn.TipoSer:FSA:CL"

7.- Tras saber a qué servidor se ha conectado, el cliente debe registrarse, iniciando la comunicación mediante el mensaje: Arn.Inicio:var0:var1:...:varn:CL donde var0, var1 a varn representan el nº de variables de las que el cliente quiere estar informado si cambian.

Arn.Inicio:

8.- Cuando alguno de los extremos, cliente o servidor, desean finalizar la comunicación y notificar al otro extremo el "cierre" se enviará desde el extremo que se cierra hacia el otro "Arn.Fin:CL"

Arn.Fin:

NOTA: El IOCPServer al enviar un Arn.Fin:CL, lo hace a todos los clientes que están conectados y "espera" un cierto tiempo, descartando los posible "Arn.Fin:CL" que emiten al cerrarse los clientes.

9.- (Solo IOCPServer) El IOCPServer entiende y responde a un mensaje especial denominado Arn.Preg: que indica al servidor que el cliente desea saber "ahora" un valor de una/s variables/s, aunque lleve/n mucho tiempo sin cambiar. Así, cualquier cliente que se vaya a conectar a un IOCPServer puede implementar la petición de un dato, aún cuando no lo tenga registrado, y preguntar al servidor por el/los valores que desee. El formato es: "Arn.Preg:var0:var1:...:varn:CL"

Arn.Preg:

10.- Tras recibir un mensaje de inicio, o tras recibir un mensaje Arn.Preg o cada vez que cambia una variable que un cliente tenga registrada, el servidor deberá generar un mensaje del tipo: "Arn.Resp:var0=val0:var1=val1:...:varn=valn:CL" donde var0, var1, a varn representa el número de la variable registrada (o preguntada) y val0, val1 a valn, representa su valor en el servidor.

Arn.Resp:

11.- Cuando un cliente desee informar al servidor que debe cambiar el valor de alguna variable, enviará al servidor el mismo mensaje que en el párrafo anterior, el "Arn.Resp:var0=val0:var1=val1:...:varn=valn:CL" donde var0, var1, a varn representa el número de la variable registrada y val0, val1 a valn, representa su valor para que el servidor la cambie. NOTA: El IOCPServer responde con un mensaje, que en condiciones normales es idéntico al recibido, de manera que el cliente tiene constancia de que el cambio se ha producido, pero si alguno de los valores enviados por el cliente al servidor no son válidos o no pueden ser 'inyectados' en el simulador en ese momento, la respuesta del servidor irá con el valor que se ha quedado en la variable.

NOTA: A veces, el simulador acepta la variable, pero a posteriori, normalmente unos 150ms, la variable vuelve a cambiar de valor y se queda como estaba, algo que el server notificará al cliente, es decir, el cliente en ese caso, recibirá primero la confirmación del cambio y algunos ms después recibirá el valor que se ha quedado en la variable.

12.- IOCPServer NO emite "Arn.Vivo:CL". Responde con un mensaje idéntico si lo recibe, pero no los emite. El control de estado de los clientes se hace mediante TCP.

Arn.Vivo:

13.- (Solo IOCPServer) Existe otro mensaje, al que el IOCPServer puede responder, que es "Arn.Key:nnn:CL" y corresponde a la petición de un cliente para que el FS "dispare" alguno de sus eventos. Esto no puede ser controlado hoy por SIOC, pero espero que pueda hacerlo. De esta manera el IOCPServer responde, por ejemplo, al EVENT_QUIT, es decir, cierra y sale del FS (Sin preguntar) con solo recibir el código de ese comando. La lista de los valores se puede bajar de la web del IOCPServer.

Arn.Key:

donde nnnn, es un evento a disparar. Puede ser una tecla, o muchas otras cosas....

 

IocpServer uIocpPnp

Powered by ENCORE SOLUTIONS tm 2009