file: job.t package: muf status: tentative
{ [ :socket socket :port 4201 :protocol :stream ( optional ) :addressFamily :internet ( optional ) :interfaces :any ( optional ) | ]listenOnSocket }
The ]listenOnSocket
function sets the Muq server to
listen for network connections on the given unix port
number.
The :socket
parameter must be a socket with a
socket$S.standardOutput
set to a messageStream.
A typical choice of messageStream
is @$s.standardInput
(the input message stream
for the job issuing the ]listenOnSocket
request).
If :protocol
is :stream
(or omitted),
each connection accepted will result in
the creation of a Socket bound to the connection, which
will be placed in the messageStream socket$S.standardOutput
. The
presumption is that some job is reading this
message stream and forking off a job for each
connection accepted.
If :protocol
is :datagram
,
socket$S.type
will be set to :udp
and the socket will return datagrams read from
that port.
The :addressFamily
parameter must currently always
be :internet
if provided.
The :interfaces
parameter must currently always
be :any
if provided.
The :port
parameter must be an integer
specifying the unix port on which to listen.
See section Choosing a port number.
Here is a complete short example of listening on a socket. Normally the work done in the example would involve three jobs, one for the listening socket, one for the server (forked by the listening job) and one for the client, probably on another machine. Here we do everything inline in one job to keep things simple; See the nanomud for a more realistic example.
( Create a socket listening ) ( for connections on port 32123: ) makeSocket --> *listen* makeMessageStream --> *listen-output* *listen-output* --> *listen*$S.standardOutput [ :socket *listen* :port 32123 :protocol :stream | ]listenOnSocket ( Open a client connection: ) makeSocket --> *client* makeMessageStream --> *client-input* makeMessageStream --> *client-output* *client-input* --> *client*$S.standardInput *client-output* --> *client*$S.standardOutput [ :socket *client* :port 32123 :protocol :stream | ]openSocket ( Accept the connection, creating server: ) *listen-output* readStreamLine --> *server* --> *opcode* ( *server* is the new socket; *opcode* is "new" ) makeMessageStream --> *server-input* makeMessageStream --> *server-output* *server-input* --> *server*$S.standardInput *server-output* --> *server*$S.standardOutput ( Send a line from client to server: ) "This is a test\n" *client-input* writeStream ( Read line at server end: ) *server-output* readStreamLine --> *who* --> *line* ( *who* == *server* and *line* is our line of text ) ( Send a line from server to client: ) "This is not a test\n" *server-input* writeStream ( Read line at client end: ) *client-output* readStreamLine --> *who* --> *line* ( *who* == *client* and *line* is our line of text ) ( Close all ports: ) [ :socket *client* | ]closeSocket [ :socket *server* | ]closeSocket [ :socket *listen* | ]closeSocket
Go to the first, previous, next, last section, table of contents.