0

I am trying to use GLib.IOChannels to send data from a client to a server running a Glib.Mainloop.

The file used for the socket should be located at /tmp/so/sock, and the server should simply run a function whenever it receives data.

This is the code I've written:

import sys
import gi
from gi.repository import GLib

ADRESS = '/tmp/so/sock'


def server():
    loop = GLib.MainLoop()
    with open(ADRESS, 'r') as sock_file:
        sock = GLib.IOChannel.unix_new(sock_file.fileno())
        GLib.io_add_watch(sock, GLib.IO_IN,
                          lambda *args: print('received:', args))
        loop.run()


def client(argv):
    sock_file = open(ADRESS, 'w')
    sock = GLib.IOChannel.unix_new(sock_file.fileno())
    try:
        print(sock.write_chars(' '.join(argv).encode('utf-8'), -1))
    except GLib.Error:
        raise
    finally:
        sock.shutdown(True)
        # sock_file.close() # calling close breaks the script?


if __name__ == '__main__':
    if len(sys.argv) > 1:
        client(sys.argv[1:])
    else:
        server()

When called without arguments, it acts as the server, if called with arguments, it sends them to a running server. When starting the server, I immediately get the following output:

received: (<GLib.IOChannel object at 0x7fbd72558b80 (GIOChannel at 0x55b8397905c0)>, <flags G_IO_IN of type GLib.IOCondition>)

I don't know why that is. Whenever I send something, I get an output like (<enum G_IO_STATUS_NORMAL of type GLib.IOStatus>, bytes_written=4) on the client side, while nothing happens server-side.

What am I missing? I suspect I understood the documentation wrong, as I did not find a concrete example.

I got the inspiration to use the IOChannel instead of normal sockets from this post: How to listen socket, when app is running in gtk.main()?

josh
  • 9
  • 1
  • 3

0 Answers0