套接字在滑动
Sockets in Swipl
本文关键字:套接字 更新时间:2023-10-16
所以我目前正处于构建游戏的开始阶段,我正在使用prolog作为游戏的服务器端来对棋盘中的游戏进行验证检查。
我现在有两个问题。
一:似乎无法在不中止的情况下关闭服务器,从而使套接字保持打开状态。代码如下
服务器:
:- 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)毫无问题地关闭客户端,但我的服务器没有关闭......它接收end_of_file,打印end_of_file但不关闭。即使将其直接插入服务器也不行。我做错了什么?
第二:我需要将一个字符串从 C++ 传递给 Swipl,该字符串具有要使用的谓词名称和参数。有人可以告诉我如何做到这一点或至少指出我正确的方向吗?
谢谢。
Int == end_of_file
不应该Int = end_of_file
,以检查统一吗?我在这里可能是错的,我使用 sicstus。
至于如何传递谓词名称和参数,这样的东西应该可以工作
call_test(Request, Answer) :-
Request = Pred(Arg1, Arg2, Arg3),
Request,
Answer = somethingHere.
然后在C++简单地做
//pseudo-code
write(socket, "myPredicate(myArg1, myArg2, myArg3).n");
如果您告诉它,Prolog 会将传入的字符串转换为实际代码。另一种更通用的实现是
call_test(Request, Answer) :-
Pred =.. Request,
Pred,
Answer = somethingHere.
并在C++
write(socket, "[myPredicate, Arg1, Arg2, Arg3].n");
//supports variable number of args
一:你可以用简单或复杂的方式解决这个问题。简单的方法不仅是重新启动您的服务器,还重新启动Prolog解释器。复杂的是调用一个谓词,当收到"关闭"消息时,该谓词会干净地退出程序。
二:read/2谓词,它将输入流(在本例中为套接字的读取端)和一个变量作为参数,解析后的输入将被放置,它做你想要的:它从输入中读取一个术语并将其转换为它所代表的Prolog术语,就像你在Prolog程序中编写它一样。请注意,在术语之后,输入必须包含一个点,以告诉Prolog术语已经结束(如其他答案所示)。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 了解是否接受套接字