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

zecapistolas

SICStus Prolog -> Gnu Prolog

3 mensagens neste tópico

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....  :biggrin:

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?!  :hmm:

cumps  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora