Sockets in Lisp
Sockets in Lisp
I'm trying to communicate from a Lisp script to another program by using TCP/IP sockets (with sbcl and the usocket library in a Linux system). Through some online sources I have managed to put together the following simple code:
(require 'asdf)
(require 'usocket)
(defun start-client (message)
"Connects to server."
(usocket:with-client-socket (socket stream "0.0.0.0" 30000)
(format stream message)
(force-output stream)))
(start-client "Hello!~%")
This code lets me send a message, (I have tested it and it works). My problem is that I need to split this code in two different functions, one for opening the socket connection and another to send different messages at different times. Also I need to add an additional function to receive messages from the other program. However, as I'm quite new with Lisp I have failed to do so.
At the end of of the program, which will make different communications in a loop, the socket will be closed.
– Janus Gowda
Sep 2 at 11:47
1 Answer
1
The best way (I think) would be to have your entire script in the scope of with-client-socket
. You might have something like a main
function where this would fit. This avoids resource leaks. You might want to use a dynamic variable to avoid passing the socket stream manually through function arguments to wherever it is needed.
with-client-socket
main
Otherwise, you have to manage the closing of the socket yourself. Any call path that might lead to program termination needs to be protected by some unwind-protect
that closes the socket using usocket:socket-close
. For that, you open the socket using usocket:socket-connect
with the same arguments as you used for usocket:with-client-socket
. (You can take a look at the source for usocket:with-client-socket
and usocket:with-connected-socket
to see the interactions taking place.)
unwind-protect
usocket:socket-close
usocket:socket-connect
usocket:with-client-socket
usocket:with-client-socket
usocket:with-connected-socket
In order to be able to write to the socket stream (obtainable through (usocket:socket-stream socket)
) and close the socket, you need to remember it somewhere, e. g. by binding a dynamic variable.
(usocket:socket-stream socket)
Hi thank you. And can that be done in a bidirectional manner? so that the socket is open to send and to receive at the same time?
– Janus Gowda
Sep 10 at 9:13
@JanusGowda: the socket stream is a bidirectional stream.
– Svante
Sep 10 at 12:17
Thank you. Your advice did help. However I did not manage yet to send bidirectional messages, thus I'm opening a new question: stackoverflow.com/questions/52259264/…
– Janus Gowda
Sep 10 at 13:50
Thanks for contributing an answer to Stack Overflow!
But avoid …
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
But avoid …
To learn more, see our tips on writing great answers.
Required, but never shown
Required, but never shown
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Re: "send different messages at different times", when should the program decide to close the socket?
– coredump
Sep 2 at 11:43