Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
zecapistolas

SICStus Prolog -> Gnu Prolog

Recommended Posts

zecapistolas

Boas,  ;)

Tenho código em Prolog, nomeadamente para comunicação através de Sockets, que eu utilizava em Windows porque tinha uma licença do SICStus Prolog para essa plataforma....

Agora que migrei para Linux, não tenho SICStus Prolog, mas tenho Gnu Prolog....  :cheesygrin:

O problema é que estou a ter algumas incompatibilidades....

O ficheiro de teste é o seguinte:

:-use_module(library(sockets)).

port(60001).

force_close:-
        socket_bk(S), socket_close(S).

socket_bk(0).

server:-
        current_host(Host),
        port(Port),
        socket('AF_INET', Socket),
        socket_bind(Socket, 'AF_INET'(Host,Port)),
        socket_listen(Socket, 5),
        socket_accept(Socket, _Client, Stream),
        abolish(socket_bk/1),asserta(socket_bk(Socket)),
        server_loop(Stream),
        socket_close(Socket),
        write('Server Exit'),nl.

server_loop(Stream) :-
        repeat,
                read(Stream, ClientRequest),
                write('Received: '), write(ClientRequest), nl, 
                server_input(ClientRequest, ServerReply),
                format(Stream, '~q.~n', [serverReply]),
                write('Send: '), write(ServerReply), nl, 
                flush_output(Stream),
        (ClientRequest == bye; ClientRequest == end_of_file), !.

% server_input(+Mensagem, -Resposta)
server_input(initialize, R):-
    R is 29, !.

server_input(bye, ok):-!.
server_input(end_of_file, ok):-!.
server_input(_, invalid) :- !.

Ao consultar, aparece este warning:

:1: warning: unknown directive use_module/1 - maybe use initialization/1 - directive ignored

Tudo bem que não passa de um warning, mas depois quando faço "server." para inicializar o Servidor aparece:

uncaught exception: error(existence_error(procedure,current_host/1),server/0)

Alguma dica?!  🤔

cumps  :P

Share this post


Link to post
Share on other sites
takecare

o predicado current_host/1 não funciona pq não me parece ser compatível com a versão do prolog que estás a usar (gnu prolog), isso é compreensível uma vez que nem o use_module é reconhecido. eu não conheço o gnu prolog, mas dei uma olhadela no manual e, talvez, se leres isto possas encontrar uma ajuda: http://www.gprolog.org/manual/gprolog.html#htoc273 :)


takecare@feup::mieic

Share this post


Link to post
Share on other sites
zecapistolas

Boas,

Já fiz algumas alterações:

port(60001).
host('127.0.0.1').

server:-
port(Port),
host(Host),
socket('AF_INET', Socket),
socket_bind(Socket, 'AF_INET'(Host, Port)),
socket_listen(Socket, 5),
socket_accept(Socket, StreamIn, StreamOut),
server_loop(StreamIn, StreamOut),
socket_close(Socket),
write('Server Exit'), nl.

server_loop(StreamIn, StreamOut):-
repeat,
	write('Repeat'), nl,
	read(StreamIn, ClientRequest),
	write('Received: '), write(ClientRequest), nl,
	server_input(ClientRequest, ServerReply),
	format(StreamOut, '~q.~n', [serverReply]),
	write('Send: '), write(ServerReply), nl,
	flush_output(StreamOut),
(ClientRequest == bye; ClientRequest == end_of_file), !.

% server_input(+Mensagem, -Resposta)
server_input(initialize, R):-
R is 29, !.

server_input(bye, ok):- !.
server_input(end_of_file, ok):- !.
server_input(_, invalid):- !.

Já recebo bem no Prolog, mas quando envio para o C++ não consigo receber nada, ou StreamOut não está a enviar, ou o "canal" está mal....

cumps  :(

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.