1:- module(ciao_sockets,
2 [ connect_to_socket/3, 3 socket_recv/2, 4 hostname_address/2, 5 socket_shutdown/2, 6 socket_recv_code/3, 7 socket_send/2, 9 socket_accept/2, 10 bind_socket/3 12 ]). 13:- use_module(library(socket)).
29connect_to_socket(Host, Port, StreamPair) :-
30 tcp_socket(Socket),
31 tcp_connect(Socket, Host:Port),
32 tcp_open_socket(Socket, Read, Write),
33 stream_pair(StreamPair, Read, Write).
41hostname_address(HostName, Address) :-
42 tcp_host_to_address(HostName, Addr0),
43 address_to_atom(Addr0, Address).
44
45address_to_atom(ip(A,B,C,D), Address) :-
46 atomic_list_concat([A,B,C,D], '.', Address).
56socket_shutdown(StreamPair, How) :-
57 stream_pair(StreamPair, Read, Write),
58 must_be(oneof([read,write,read_write]), How),
59 ( How == read
60 -> close(Read)
61 ; How == write
62 -> close(Write)
63 ; catch(close(Write), E, true),
64 close(Read),
65 ( nonvar(E)
66 -> throw(E)
67 ; true
68 )
69 ).
76socket_recv(Stream, String) :-
77 socket_recv_code(Stream, String, _).
84socket_recv_code(StreamPair, String, Length) :-
85 ( at_end_of_stream(StreamPair)
86 -> String = "",
87 Length = -1
88 ; read_pending_codes(StreamPair, String, []),
89 length(String, Length)
90 ).
101socket_send(StreamPair, String) :-
102 format(StreamPair, '~s', [String]),
103 flush_output(StreamPair).
112bind_socket(Port, Length, Socket) :-
113 tcp_socket(Socket),
114 tcp_setopt(Socket, reuseaddr),
115 tcp_bind(Socket, Port),
116 tcp_listen(Socket, Length).
122socket_accept(Socket, StreamPair) :-
123 tcp_accept(Socket, Client, _Peer),
124 tcp_open_socket(Client, Read, Write),
125 stream_pair(StreamPair, Read, Write)
CIAO Compatible socket interface
This library emulates
library(sockets)
from CIAO Prolog. One of the problems we are faced with here is that CIAO streams appear to be read/write, while SWI-Prolog streams are either input or output. For this reason, SWI-Prolog introduced stream_pair/3. */