From: Rui M. <ru...@us...> - 2006-10-24 18:42:18
|
Update of /cvsroot/xsb/XSB/examples/threads In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv5922/threads Added Files: hl_socket.P msgclient.P mtmsgserver.P Log Message: example of a multi-threaded server --- NEW FILE: hl_socket.P --- %%% %%% Slightly higher level socket predicates %%% :- compiler_options([xpp_on]). #include "socket_defs_xsb.h" #include "char_defs.h" :- import socket_bind/3, socket_listen/3, socket_accept/3, socket/2, socket_connect/4, socket_close/2, socket_recv/3, socket_send/3 from socket. :- import file_close/1 from file_io. :- export socket_bind/2, socket_listen/2, socket_accept/2, socket/1, socket_connect/3, socket_close/1, socket_recv_term/2, socket_send_term/2. check_rc( Prim, Rc ) :- ( Rc =\= SOCK_OK -> P =.. [Prim, Rc], throw( socket(P) ) ; true ). socket_close(Sockfd) :- socket_close(Sockfd, Rc), check_rc( socket_close, Rc ). socket_send_term(SockFD, Term) :- fmt_write_string(TermStr, '%S.', arg(Term)), socket_send(SockFD, TermStr, Rc), check_rc( socket_send_term, Rc ). socket_recv_term(SockFD, Term) :- socket_recv(SockFD, AnswerStr,Rc), check_rc( socket_recv_term, Rc ), file_open(AnswerStr,sr,IOport), file_read(IOport,Term), file_close(IOport). socket(Sockfd) :- socket(Sockfd, Rc), check_rc( socket, Rc ). socket_connect(Sockfd, Port, IPAddrOrHostname) :- socket_connect(Sockfd, Port, IPAddrOrHostname, Rc), check_rc( socket_connect, Rc ). socket_bind(Sockfd, Port) :- socket_bind(Sockfd, Port, Rc), check_rc( socket_bind, Rc ). socket_listen(Sockfd,QLen) :- socket_listen(Sockfd,QLen, Rc), check_rc( socket_listen, Rc ). socket_accept(Sockfd, Sockfd1) :- socket_accept(Sockfd, Sockfd1, Rc), check_rc( socket_listen, Rc ). --- NEW FILE: msgclient.P --- %%% Client for the multi-threaded server example %%% Adapted from the sockets example %%% :- compiler_options([xpp_on]). #include "socket_defs_xsb.h" #include "char_defs.h" :- import socket/1, socket_connect/3, socket_close/1, socket_recv_term/2, socket_send_term/2 from hl_socket. :- import socket_set_option/3 from socket. %% machine where server is running machine(localhost). %% Try something else: %%machine(compserv1). %% Port on which the server is listening %% Server must bind to this port xsb_port(6006). client :- writeln('started client...'), machine(IPAddrOrHostname), xsb_port(XSB_port), connect(Sockfd ,XSB_port, IPAddrOrHostname), client_loop(Sockfd). client_loop(Sockfd) :- nl, write('Please enter goal: g(X). or h(X). Type e. to finish. Goal: '), read_canonical(Goal), ((Goal == 'e' ; Goal == end_of_file) -> !, socket_close(Sockfd), writeln('Exiting.'), true ; nl,writeln(send(Goal)), socket_send_term(Sockfd, Goal), writeln('Answers: '), repeat, socket_recv_term(Sockfd, Answer), (Answer==end_of_file -> !, true ; ( Answer == 'end' -> client_loop(Sockfd) ; write(' '), write(Answer), nl, fail ) ) ). %% Open socket and connect connect(Sockfd0,XSB_port,IPAddrOrHostname) :- socket(Sockfd0), socket_set_option(Sockfd0,linger,SOCK_NOLINGER), socket_connect(Sockfd0, XSB_port, IPAddrOrHostname). --- NEW FILE: mtmsgserver.P --- %%% %%% A multi-threaded goal server that uses sockets to communicate %%% Adapted from the sockets exampleAdapted from the sockets example %%% :- compiler_options([xpp_on]). #include "socket_defs_xsb.h" #include "char_defs.h" #define Q_LENGTH 10 :- import socket/1, socket_bind/2, socket_listen/2, socket_accept/2, socket_close/1, socket_recv_term/2, socket_send_term/2 from hl_socket. :- import socket_set_option/3 from socket. :- import thread_create/3 from thread. %% Port on which the server is listening xsb_port(6006). server :- socket(Sockfd0), socket_set_option(Sockfd0,linger,SOCK_NOLINGER), xsb_port(XSBPort), socket_bind(Sockfd0, XSBPort), socket_listen(Sockfd0,Q_LENGTH), server_loop(Sockfd0). server_loop(Sockfd0) :- socket_accept(Sockfd0, Sockfd0_out1), thread_create(serve_client(Sockfd0_out1),_,[detached(true)]), fail. server_loop(Sockfd0) :- server_loop(Sockfd0). serve_client(Sockfd) :- write('Waiting for input... '), catch( socket_recv_term(Sockfd, Goal), socket(_), Goal = end_of_file ), (Goal==end_of_file -> writeln('End of file or communication error'), writeln('Client quits...'), socket_close(Sockfd) ; writeln(goal(Goal)), ((Goal=h(_); Goal=g(_)) -> call(Goal), writeln(answer(Goal)), socket_send_term(Sockfd, Goal) ; write('Invalid goal: '), writeln(Goal), socket_send(Sockfd, invalid_goal(Goal)) ), fail ). serve_client(Sockfd) :- socket_send_term(Sockfd, end), serve_client(Sockfd). g(1). g(2). g(3). g(4). g(5). h(a). h(b). h(c). h(d). h(e). |