users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Reading binary data via a socket...


From: emacstheviking
Subject: Reading binary data via a socket...
Date: Fri, 22 Nov 2013 14:15:06 +0000

Hi,

In a nutshell: how do I read binary data from a socket with socket, get_byte et al ?

I have written a Redis client (against 2.8) which is fully functional and ready to release but I have been writing test cases for as many of the commands as I can without going mad on it and when I use the DUMP command it barfs. Here is the session:

| ?- [gpredis].
compiling /home/sean/tmp/gnu-prolog-redis-client/gpredis.pl for byte code...
/home/sean/tmp/gnu-prolog-redis-client/gpredis.pl compiled, 192 lines read - 16073 bytes written, 17 ms

(4 ms) yes
| ?- redis(set(gnu_prolog, 'Is awesome!')).
STATUS: OK

yes
| ?- redis(get(gnu_prolog)).
STRING: Is awesome!

true ? 

yes
| ?- redis(dump(gnu_prolog)).
uncaught exception: error(representation_error(character),get_code/2)
| ?- 

The problem is that I am opening the socket like this:

redis_connect(Conn) :-
redis_connect(Conn, localhost, 6379).

redis_connect(redis(SI, SO, S), Host, Port) :-
socket('AF_INET', S),
socket_connect(S, 'AF_INET'(Host, Port), SI, SO),
set_stream_type(S, binary).  %% added to see if I could fix it but no dice so far!

and then I use get_code/2 everywhere. That seemed like a good idea initially because redis deals with strings but they are binary safe and this obviously isn't, I can cope with that if I can figure out how to do it with set_stream_type/. open/3,open/4 allow the mode to be set but how do I coerce a socket into binary mode with GNU Prolog?

Somewhere in there I need to force it into binary mode but it being Friday and all I can't seem to figure it out...I am really keen to release this project to GitHub but I refuse until I am happy with it!

My client handles all redis commands by de-constructing the term passed into the redis() predicate, output to the console but the redis_do() predicate passes back the results. Once I have this issue solved it will be a matter of days to complete and release it so any assistance would be appreciated. I will probably crack it tonight myself but I am at work and thought I would look into it at lunchtime! This is my first "useful" bit of Prolog (well, useful to me so far!) and I am keen to complete it *and* understand it.

:)

Thanks,
Sean.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]