All Func Prot

VC97 3 3 ­4 Auto range digital multimeter all func prot
VC97 3 3 ­4 Auto range digital multimeter all func prot
Paypal   US $33.39
VC97 3 3 ­4 Auto range multimeter all func prot USA war
VC97 3 3 ­4 Auto range multimeter all func prot USA war
Paypal   US $28.45
Powered by phpBay Pro

Escribir plugins para RDesktop

Escrito por:

Sergey Yakimenko,
Desarrollador Senior de Software del Equipo Conductor,
Apriorit Inc, http://www.apriorit.com

Contenido

Acerca de este artículo: cuando la pena leer
Rdesktop. Protocolo RDP
plugins escribir en rdesktop: programación orientada a objetos utilizando el parche
Desde principios al código
parte del cliente: plugin
parte del cliente: rdesktop
Parte del servidor
El final

Acerca de este artículo: cuando se vale la pena leer

Este artículo fue escrito principalmente para los desarrolladores de Linux. El artículo proporciona un método de escribir de plugins-proceso de software de código abierto - es decir, los plugins que funcionará como parte del software, pero se ejecuta en otro proceso, por lo que su código puede permanecer cerrado.

En general no hay necesidad de utilizar el método expuesto en este texto. Rdesktop es un software gratuito y siempre puede modificar sus fuentes en la forma que necesita. Sin embargo, esto significa que usted debe hacer que el código abierto también, porque esto es lo que la licencia GPL requiere. Si no deseas que esto sin embargo, sigue leyendo y aprenderás cómo evitar el requisito de licencia GPL y para escribir un plugin que código será cerrado, pero el trabajo como parte de Rdesktop código.

También puede leer esto para saber algo de interés sobre:

  • Protocolo RDP
  • Rdesktop - un código abierto RDP de cliente
  • una manera simple de comunicación entre procesos en sistemas * nix.

Vamos a empezar.

Rdesktop. protocolo RDP.

Esto es para aquellos que no saben lo que se trata. Remote Desktop Protocol (RDP) es un protocolo propietario desarrollado por Microsoft, que trata de proveer de un usuario con una gráfica interfaz a otro equipo. Esto es muy útil - usted puede trabajar en otro equipo sentado en su escritorio, casi sin diferencias en la apariencia y el rendimiento (por supuesto, si usted tiene una buena conexión de red - Hi-Speed, con una latencia pequeña, y así sucesivamente). Hay clientes RDP para casi todos los sistemas operativos - Windows, Linux, Mac OS, y todos ellos utilizan el protocolo RDP para conectarse a un servidor RDP - un host remoto que desea trabajar. En 2008 Microsoft abrió especificaciones RDP, ahora están disponibles en su sitio: http://msdn.microsoft.com/en-us/library/cc216513 (PROT.10). aspx.

Rdesktop es un cliente de código abierto para Windows Terminal Services. En la actualidad funciona en la mayoría basados ​​en UNIX plataformas con el sistema X Window. Soporta la mayoría de las características básicas del protocolo RDP, y muchas extensiones de protocolo, incluida la redirección de audio, el portapapeles, sistema de archivos local y dispositivos locales redirección. Rdesktop es liberado bajo la GNU Public License (GPL).

Al igual que muchos otros programas de * nix, Rdesktop es una aplicación de línea de comandos. Tiene un montón de diferentes parámetros de entrada que configurar una sesión remota - las credenciales del usuario, la dirección del servidor, de escritorio dimensiones, profundidad de color, también la descripción de los dispositivos locales que van a ser redirigido con el equipo remoto - comporta, impresoras, sonido, discos.

En el análisis de su línea de comandos e iniciar una sesión en un host remoto, rdesktop entra en un bucle sin fin en el que se lee es decir, los datos de entrada, los datos enviados por el servidor, y envía algunos datos con el servidor en respuesta. La conexión con el servidor se realiza a través de canales virtuales llamados. Microsoft tiene un piso:

"Canales virtuales son extensiones de software que se puede utilizar para agregar mejoras funcionales a una aplicación de Servicios de Escritorio remoto. Ejemplos de mejoras funcionales podrían incluyen: soporte para tipos especiales de hardware, de audio, u otras ampliaciones de la funcionalidad básica proporcionada por los Servicios de Escritorio remoto Remote Desktop Protocol (RDP - http://msdn.microsoft.com/en-us/library/aa383015 (vs. 85). aspx). El protocolo RDP proporciona gestión de multiplexado de múltiples canales virtuales.
Una aplicación de canal virtual tiene dos partes, un componente del lado del cliente y un componente del lado del servidor. El lado del servidor componente es un programa ejecutable que se ejecutan en la sesión de escritorio remoto de host (RD host de sesión) servidor. El componente del lado del cliente es un DLL que se carga en memoria en el equipo cliente cuando el Remote Desktop Connection (RDC), programa de cliente se ejecuta.
canales virtuales pueden agregar mejoras funcionales a una conexión de escritorio remoto (RDC), independiente del protocolo RDP. Con el apoyo del canal virtual, las nuevas características se pueden agregar sin tener que actualizar el software de cliente o servidor, o el protocolo RDP. "

Así, los canales virtuales son sólo una forma de cómo dos extremos - un cliente y un servidor de programas, por ejemplo - pueden conectarse entre sí de forma independiente del protocolo de la capa inferior. En Servicios de Escritorio remoto el protocolo es RDP, pero puede ser cualquier otro en el supuesto de que proporcionaría capacidades similares.

plugins escribir en rdesktop: programación orientada a objetos utilizando el parche

Como se mencionó anteriormente, siempre puedes modificar las fuentes de rdesktop para agregar o cambiar la funcionalidad necesaria. Hay otra manera, sin embargo - si usted no quiere abrir los cambios código a todo el mundo, puede crear un programa independiente que funciona como un rdesktop complemento.

No es un parche que hace que la capacidad del canal virtual en rdesktop visible para el terceras partes - es decir, permiten crear y trabajar con otros canales virtuales que los controladores son implementados como programas separados. El parche está principalmente escrito por Simón Guerrero. Usted puede obtener el parche aquí: Sourceforge.net (http://sourceforge.net/tracker/index.php?func=detail&aid=1472969&group_id=24366&atid=381349 - la descripción detallada en la página no está actualizado - se refiere a la antigua versión del parche, y no refleja su estado actual. Es simplemente inútil). Después de estar actualizado con este parche, rdesktop recibe un adicional "Redirección (-r)" parámetro - '-r addin. El formato completo del parámetro es:

addin-r: <channelname>: </ ruta / al / ejecutable> [: arg1 [: arg2 :]...]

donde

<channelname> - nombre del canal virtual deseada; </ ruta / al / ejecutable> - ruta de acceso al controlador de VC; [: arg1 [: arg2 :]...] - Parámetros opcionales que se pasan al controlador de rdesktop.

Unas palabras sobre el controlador de capital riesgo. Cuando rdesktop crea el proceso de controlador y el canal virtual correspondiente, que conecta la CV salida a la entrada estándar del proceso (stdin), y viceversa - que es la salida estándar (stdout) es conectado a la entrada de la CV. Los parámetros opcionales se pasan al proceso de como parámetros de línea de comandos. Por lo tanto, lo único que el controlador debe hacer es leer los datos entrantes en VC de la entrada estándar y escribir los datos salientes VC a stdout. Muy esquema simple y claro, a continuación se describe con más detalle.

De los principios a código

Bueno, así es como funciona. El código no es tan elegante, pero funciona y hace lo que es sea ​​necesario. Por lo tanto, echemos un vistazo:

parte del cliente: plugin

Cuando plugin se inicia, sabe que ha sido dirigido por rdesktop, y su stdin stdout y están conectados a la entrada del canal virtual y salida. Así plugin solo funciona un bucle sin fin en la que lee los datos de la CV y ​​envía algunos datos de respuesta cuando sea necesario. También establece un manejador de la señal SIGUSR1, por lo que puede terminar rdesktop plugin tarea correctamente. Cuando rdesktop se desconectará del equipo remoto, se enviará SIGUSR1 a todos los plugins y complementos en la recepción SIGUSR1 debe dejar de trabajar:

g_end_flag static int = 0; / / rdesktop nos envía un evento de cierre enviando SIGUSR1 sigusr1_handler void (int signum) {g_end_flag = 1;} / / estamos lanzada por rdesktop con los siguientes parámetros: / / 1) nuestros fines de los tubos de lectura y escritura que nos conecta con rdesktop / / se pasan como stdin y stdout; / / 2) todos los parámetros se pasan a través de argv [] int main (int argc, char ** argv) {datos char * = NULL; datalen unsigned long = 0; pipe_to_read int = -1; pipe_to_write int = -1; Int i; / / configurar el controlador de SIGUSR1 struct sigaction sa; sa.sa_handler = sigusr1_handler; sigaction (SIGUSR1, y sa, NULL); pipe_to_write = Dup (STDOUT_FILENO); pipe_to_read = dup (STDIN_FILENO), mientras que {bytes_read ssize_t = leer (pipe_to_read, y datalen, sizeof (unsigned (g_end_flag!) de largo)); if (g_end_flag) descanso, y si (bytes_read <= 0) {perror ("tubo de leer"); break;} datos = Malloc (datalen); all_read ssize_t = 0; do {bytes_read = leer (pipe_to_read, datos + all_read, datalen - all_read); all_read bytes_read + =;} while (bytes_read> 0 & & datalen <all_read & & g_end_flag!); / / Sólo tienes que enviar los datos recibidos de vuelta si (bytes_read> 0) {escribir (pipe_to_write, y datalen, sizeof (unsigned long)); escribir (pipe_to_write, datos, datalen);} data = NULL;; libre (datos)} final:

if (data = NULL!) libre (datos); cierre (pipe_to_read), cerca (pipe_to_write); return 0;}

parte del cliente: rdesktop

Cuando encuentra rdesktop un "complemento-r 'parámetro,

caso de «r»: si (str_startswith (optarg, "Addin")) {inicializa el complemento, y agregarlo a la lista de complementos: init_external_addin (addin_name, addin_path, p, y addin_data [addin_count]);. if (addin_data [addin_count] pid = 0)! {addin_count + +;}

En el complemento rdesktop función init prepara complemento parámetros, crea su proceso y lo conecta con las tuberías:

init_external_addin void (addin_name char *, addin_path char *, char * args, ADDIN_DATA * addin_data) {char * P; current_arg char *, char * argv [256]; argv_buffer char [256] [256]; int i; readpipe int [2], writepipe [2]; niño pid_t; / * Inicializa * addin estructura / memset (addin_data, 0, sizeof (ADDIN_DATA)); / * Ir a través de la lista de argumentos, añadiendo que cada uno * argv / argv [0] = addin_path; i = 1, p = current_arg = args, mientras que (current_arg ! = 0 & & current_arg [0] = " 0") {p = next_arg (p, ":");; si (p = 0 & & p * = " 0"!) * (P - 1) = " 0"; strcpy (argv_buffer [i], current_arg); argv [i] = argv_buffer [i], i + +; current_arg = p;} argv [i] = NULL, / * Crear * tubos / if (tubo (readpipe) < 0 | | tubo (writepipe) <0) {perror ("tubos para addin"); return;} / * Tenedor proceso * / if ((= niño tenedor ()) <0) {perror ("tenedor para addin") ; return;} / * hijo * / if (niño == 0) {/ * Establecer stdin y stdout del niño a la tubería pertinentes termina * / dup2 (writepipe [0], 0); dup2 (readpipe [1], 1); / * Cierre todas las FDS, ya que no se necesitan ahora * / cerrar (readpipe [0]); cerca (readpipe [1]), cerca (writepipe [0]); cerca (writepipe [1]); execvp ((char *) argv [0], (Char **) argv); perror ("Error al ejecutar niño"); _exit (128);} else {strcpy (nombre addin_data->, addin_name); / * Cerrar la final infantil fd "* s / cierre (readpipe [1 ]); cierre (writepipe [0]); pipe_read addin_data-> readpipe = [0]; pipe_write addin_data-> = writepipe [1]; vchannel addin_data-> = channel_register (addin_name, CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP, addin_callback), si (vchannel addin_data->) {perror ("Canal registro no"); return;} pid más addin_data-> = niño;! }}

El addin_callback () es llamado cada vez que algunos datos se reciben del complemento VC:

/ * Genérico de devolución de llamada para la entrega de datos a terceros * complementos / addin_callback void (s STREAM, nombre char *) {pid_t pid; pipe_read int, int pipe_write; uint32 bloque; / p * s-> es el comienzo y el final-s> es el fin más * 1 / bloque = Fin de s-> - p-s> / * mirar para arriba para el complemento por el * nombre de Capital Riesgo lookup_addin (nombre, y pid e pipe_read, y pipe_write); if (pid!) Perror ("Can" t localizar addin "); else {/ * Anteponer el bloque con el tamaño de bloque para que el complemento se puede identificar bloques * / escribir (pipe_write, y de bloque, sizeof (uint32)), escribir (pipe_write, p-s>, de bloque);}}

Los datos de complemento se leen añadiendo el complemento en el extremo del tubo para el conjunto de descriptores de archivo

/ * Agregar el complemento en las tuberías para el conjunto de descriptores de archivo * / Addin_add_fds void (* n int, rfds fd_set *) {extern ADDIN_DATA addin_data []; addin_count extern int, int i; for (i = 0; i <addin_count; i + +). {FD_SET (addin_data [i] pipe_read, DR), MAX * n = (n *, addin_data [i] pipe_read);.}}

a continuación, seleccione () "ing con el conjunto:

seleccionar (n, y DR, y wfds, NULL, y TV);

Los descriptores se comprueban en un bucle sin fin.

/ * Verifica en el complemento en las tuberías de los datos para escribir * / addin_check_fds void (DR fd_set *) {extern ADDIN_DATA addin_data []; addin_count extern int, int i; char buffer [1024]; bytes_read ssize_t; STREAM s; for (i = 0; i <addin_count; i + +). {if (FD_ISSET (addin_data [i] pipe_read, DR)) {bytes_read = leer (addin_data [i] pipe_read, buffer, 1024);. if (bytes_read> 0) {/ * escribir * vc apropiada / s = channel_init (addin_data [i] vchannel. bytes_read); memcpy (p-s>, tampón, bytes_read), p-s> + = bytes_read; final s-> s = p->; channel_send (s, addin_data [i] vchannel);.}}}}

Parte del servidor

En el lado del servidor debe abrir un canal virtual correspondiente y esperar a que la solicitud del cliente. Usted puede encontrar un ejemplo de la página de muestras: ejemplo - http://sourceforge.net/tracker/download.php?group_id=24366&atid=381349&file_id=313601&aid=1472969.

La final

Bueno, eso es todo. Esperamos que esta información era útil. Usted puede utilizar este método no sólo para rdesktop, pero para otros programas también - cada vez que desea escribir un código cerrado complemento para algún programa cuyo código se pueden modificar.

Por lo tanto, buena suerte!

About the Author

Apriorit is the providers of the professional consulting and software development services in the knowledge-intensive scopes.

One of the key values of Apriorit's specialists is knowledge generation and sharing of experience.

Learn more about Apriorit and its experience at Apriorit Official site

VC97 3 3 ­4 Auto range digital multimeter all func prot
VC97 3 3 ­4 Auto range digital multimeter all func prot
Paypal   US $33.39
VC97 3 3 ­4 Auto range multimeter all func prot USA war
VC97 3 3 ­4 Auto range multimeter all func prot USA war
Paypal   US $28.45
Powered by phpBay Pro