Hi Bob,
SOCKET-LISTEN (even the correspond BSD socket function, listen()) is for TCP
only. To create a simple, single-threaded UDP server, you can use
SOCKET-CONNECT with LOCAL-HOST and LOCAL-PORT keyword arguments, which is
mentioned in USOCKET's API document [1]:
local-host and local-port, when specified, will cause the socket
calling bind() on local address.
This is useful for selecting interfaces to send, or listening on UDP
port.
Note: use only one of them are allowed when reasonable (listen on
wildcard address, or bind to random free port).
Once you have created such a UDP socket, you can repeatedly read that socket to
get a request from clients and then send out the reply packet back to the
clients. You can take a look at the implementation of USOCKET:SOCKET-SERVER
and internal function UDP-EVENT-LOOP for example. As far as I know, most
kinds of real UDP servers (i.e. lightweight DNS or SNMP servers) could work in
this simple way, although complex (or heavy loaded) UDP services like TFTP
servers cannot work (require multi-threading, but the creation of sockets are
the same way).
Hope this helps,
Chun Tian (binghe)
[1] http://common-lisp.net/project/usocket/api-docs.shtml
Il giorno 22/apr/2014, alle ore 02:41, Robert Brown <[email protected]> ha
scritto:
> The socket-listen function in backend/sbcl.lisp does not
> support ":type :datagram :protocol :udp". Instead, it always
> creates a stream TCP socket. I think the fix is to use
> code similar to that in socket-connect for UDP datagram
> sockets.
>
> Bob
>
> _______________________________________________
> Usocket-devel mailing list
> [email protected]
> http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel
_______________________________________________
Usocket-devel mailing list
[email protected]
http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel