Something I could do is set up two queues (lists?) in Scheme, one for incoming events and one for outgoing. My scheme code would then run in some sort of a thread, polling the incoming queue and posting events to the outgoing queue. C++ would poll the outgoing queue and post events to the incoming queue via a Scheme call.
Writing Scheme bindings for the networking library and for SDL could be another option but I'd rather try to set up a thin C++ to Scheme interface layer first as it would let me focus on the application logic.
Are you willing to start a C thread for the Scheme code? This would decouple control between Scheme and C, allowing timers to be implemented in Scheme with the I/O timeout mechanisms. Then you need two pipes between the C and Scheme worlds. These pipes could be actual OS pipes, sockets, or a new type of device (this would be more efficient and portable, but require the implementation of a new device in _os_io.c).
Marc