On Tue, Nov 17, 2015 at 1:59 PM, Chris Vine <ch...@cvine.freeserve.co.uk> wrote: > 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
This seems to be exactly what I'm looking for, thank you! -- Jan Synáček