scsh-users
[Top] [All Lists]

Using SELECT on sockets

To: scsh@martigny.ai.mit.edu
Subject: Using SELECT on sockets
From: shivers@ai.mit.edu (Olin Shivers)
Date: 18 Jun 1996 12:24:40 -0400
Organization: Artificial Intelligence Lab, MIT
Reply-to: shivers@ai.mit.edu
   From: jsc@atype.COM (Jin S. Choi)
   Newsgroups: comp.lang.scheme.scsh
   Date: 18 Jun 1996 11:27:16 -0400

   I'm interested in writing a multiuser game server using scsh, one
   where clients can connect, log in, and interact with other
   clients. 

Cool!

   This requires non-blocking sockets, so that the server can
   process current clients while accepting new ones. As scsh doesn't
   currently support threads, the only way I've found to be able to do
   this is to use a big event loop, selecting on all the user sockets and
   the accept socket. Unfortunately, the scsh select function doesn't
   seem to want to take any sockets I feed to it, claiming it's a bad
   argument; it only likes small integers and fdports. The man page for
   accept(2) claims:

          It  is  possible to select(2) a socket for the purposes of
          doing an accept by selecting it for read.

   so I was wondering if it would be possible to allow sockets to get
   through select's type checking.

A C socket (which is what the select(2) man page describes) is an integer
file descriptor. You can feed it to the C select function.

A scsh socket is a more complex record, with the following structure:

    (define-record socket
        family  ; protocol family
        inport  ; input port
        outport ; output port
        )

You can't feed one of these things to the scsh SELECT procedure -- SELECT only
takes integer file descriptors and Scheme I/O ports.

But you *can* feed the ports (SOCKET:INPORT sock) and (SOCKET:OUTPORT sock)
to SELECT -- they *are* ports.

We would have avoided this small complication by representing a socket in scsh
as a bidirectional input/output Scheme port.  But Scheme doesn't provide
bidirectional ports, so that's not possible. Instead, sockets package up a
pair of ports, one for each direction.

Does this answer your question?  You can find more detail in the sockets
chapter of the manual.
    -Olin

P.S. One more hint: if you want to do a multi-player game with sockets,
     you might talk to Prof. Ian Horswill (ian@ils.nwu.edu). He has
     students who work on similar stuff in S48, too.

<Prev in Thread] Current Thread [Next in Thread>