因此,我目前處於構建遊戲的初始階段,並且我正在使用prolog作爲遊戲的服務器端來對板中的遊戲進行驗證檢查。Swipl中的套接字
我現在有兩個問題。
其中一個: 似乎無法關閉服務器而無需中止,從而將套接字打開。 代碼如下
服務器:
:- use_module(library(socket)).
create_server(Port) :-
tcp_socket(Socket),
tcp_bind(Socket, Port),
tcp_listen(Socket, 5),
tcp_open_socket(Socket, AcceptFd, _),
dispatch(AcceptFd).
dispatch(AcceptFd) :-
tcp_accept(AcceptFd, Socket, Peer),
thread_create(process_client(Socket, Peer), _,
[ detached(true)
]),
dispatch(AcceptFd).
process_client(Socket, _Peer) :-
setup_call_cleanup(tcp_open_socket(Socket, In, Out),
handle_service(In, Out),
close_connection(In, Out)).
close_connection(In, Out) :-
close(In, [force(true)]),
close(Out, [force(true)]).
handle_service(In, Out) :-
read(In, Int),
writeln(Int),
( Int == end_of_file
-> true
;
call_test(Int,Term),
format(Out, 'seen(~q).~n', [Term]),
flush_output(Out),
handle_service(In, Out)
).
call_test(test,Term):-Term = 'really test'.
call_test(validate(teste),Term):-
String = "validate(test)",
string_to_list(String,List),
read_from_chars(List,Stringf),
writeln(Stringf),
Term = 'foo'.
客戶:
:- use_module(library(streampool)).
create_client(Host, Port) :-
setup_call_catcher_cleanup(tcp_socket(Socket),
tcp_connect(Socket, Host:Port),
exception(_),
tcp_close_socket(Socket)),
setup_call_cleanup(tcp_open_socket(Socket, In, Out),
chat_to_server(In, Out),
close_connection(In, Out)).
chat_to_server(In, Out) :-
read(Term),
( Term == end_of_file
-> true
; format(Out, '~q .~n', [Term]),
flush_output(Out),
read(In, Reply),
write(Reply),
%format('Reply: ~q.~n', [Reply]),
chat_to_server(In, Out)
).
close_connection(In, Out) :-
close(In, [force(true)]),
close(Out, [force(true)]).
我可以使用CTRL沒有問題,關閉客戶端+ d(這是END_OF_FILE),但我的服務器沒有按」 t關閉...它接收到end_of_file,它會打印end_of_file,但它不會關閉。甚至沒有將其直接插入到服務器中。我究竟做錯了什麼?
二:我需要從C++傳遞一個字符串到Swipl,它具有要使用的謂詞的名稱和參數。有人可以告訴我如何做到這一點,或至少指出我在正確的方向嗎?
非常感謝。
好吧,據我所知,處理給定連接的線程正常關閉。會發生什麼是我似乎無法遠程關閉main_thread ......也許我們不應該能夠這樣做。無論如何,感謝您的幫助。 :) – Sidner