Idioma:
English
En esta página
GUI
Código cliente
Código servidor
Gracias
Temas
GIOChannel
Gio.IOChannel
FIFO chat
Socket chat
El canal GIOChannel intenta de brindar un método portatil para el de diferentes medios de comunicación: pipes, descriptores de archivos, y zócalos. Además intenta de integrar su uso en el lazo principal del programa. Actualmente, sólo en Linux el soporte es completo, en Windows todavía quedan algunos problemas.
Para crear un nuevo GIOChannel, se utiliza la función g_io_channel_unix_new() para conectar un canal con un archivo abierto. Esto funciona para los tres tipos de archivos. Alternativamente, se puede crear un archivo nuevo, en forma independiente del sistema, utilizando g_io_channel_new_file(). En el ejemplo, se abre un puerto serial, luego el canal. |
GIOChannel *ioch; fd = open(port, O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd == -1) <mensaje de error y salida> ... ioch = g_io_channel_unix_new(fd); |
Una vez creado el archivo, se puede leer ( g_io_channel_read_chars()), escribir ( g_io_channel_write_chars()), cambiar de posición ( g_io_channel_seek_position()), y cerrar el canal ( g_io_channel_close()). |
g_io_channel_write_chars(ioch, &cmd, 1, &written, &error); g_io_channel_flush(ioch, NULL); |
Para evitar la necesidad de controlar el canal continuamente, se pueden declarar funciones que serán llamados al producirse el evento correspondientes con g_io_add_watch() o g_io_add_watch_full(). |
int iowatch = -1; iowatch = g_io_add_watch(ioch, G_IO_IN, io_callback, NULL); |
En este caso es necesario de definir una función que será llamada cuando se produce el evento (en este caso, io_callback será llamada cuando se produce el evento 'G_IO_IN', i.e. cuando entran caracteres por el canal. |
gboolean io_callback(GIOChannel *ioch, GIOCondition cond, gpointer data) { int bytes_read; unsigned char chr; do { g_io_channel_read_chars(ioch, &chr, 1, &bytes_read, NULL); if (bytes_read) { process_char(chr); if (pref.diag_comm) printf("%02x\n", chr); } } while (bytes_read); return TRUE; } |
(c) John Coppens ON6JC/LW3HAZ | correo |