On Tue, 17 Nov 2015 10:53:19 +0100 <to...@tuxteam.de> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On Mon, Nov 16, 2015 at 11:54:33AM +0100, Amirouche Boubekki wrote: > > On 2015-11-13 21:41, Jan Synáček wrote: > > [...] > > > >I have an open fd to a unix socket and I want to read data from > > >it. I know that the data is going to be only strings, but I don't > > >know the length in advance. > > > > Do you know a delimiter? maybe it's the null char? > > > > TCP is stream oriented, it's not structured at this layer into > > messages or segments. You need some knowledge about the byte stream > > to be able to split it into different meaningful piece for the > > upper layer. > > I think I "got" Jan's request, because I've been in a similar > situation before: delimiter is not (yet) part of it. What he's > looking for is an interface à la read(2), meaning "gimme as much > as there is in the queue, up to N bytes, and tell me how much > you gave me". Of course, putting stuff in a byte vector would > be preferable; the only functions I've seen[1] which "do" that > interface are read-string!/partial and write-string/partial > operate on strings, not byte arrays, alas.
guile's R6RS implementation has get-bytevector-some, which will do that for you, with unix-read-like behaviour. You cannot use this for UTF-8 text by trying to convert the bytevector with utf8->string, because you could have received a partially formed utf-8 character. So for text, you should use line orientated reading, such as with ice-9 read-line or R6RS get-line. Chris