【发布时间】:2021-02-01 17:07:56
【问题描述】:
我真的是 Ada 的新手,想在 Ada 和 Python 之间创建一个 TCP 套接字。 Ada 程序应充当服务器,Python 程序应充当客户端。主要用例是从 Python 接收字符串命令并确认它们的执行。
如果没有 Ada 服务器中的 Ada.Streams.Write(Channel.All, Data); 和 data = s.recv(512),至少可以从 Python 客户端接收 Hello World。
我想从 Ada 服务器向 Python 客户端发送一个答案,这就是我卡住的地方。我收到“套接字错误连接超时”。
Ada 服务器:
use GNAT.Sockets;
Server : Socket_Type;
Socket : Socket_Type;
Address : Sock_Addr_Type;
Channel : Stream_Access;
Data : Stream_Element_Array(1 .. 512);
Last : Stream_Element_Offset;
S : Unbounded_String;
begin
Put_Line("Server Config Started..");
Create_Socket(Server);
Set_Socket_Option(Server,
Socket_Level,
(Reuse_Address, True));
Set_Socket_Option(Server, Socket_Level,(Receive_Timeout, Timeout => 5.0));
Bind_Socket(Server, Address => (Family => Family_Inet, Addr => Inet_Addr("127.0.0.2"), Port => 65432));
Listen_Socket(Server);
Accept_Socket(Server, Socket, Address);
Put_Line("Client connected from:" & Image(Address));
Channel := Stream(Socket);
Ada.Streams.Read(Channel.All, Data, Last);
Put_Line("Received:");
for I in 1 .. Last loop
Put(Character'Val(Data(I)));
end loop;
Ada.Streams.Write(Channel.All, Data);
Python 客户端:
HOST = '127.0.0.2'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(512)
我做错了什么?有人提示吗? 提前致谢。
【问题讨论】:
-
Ada 一方卡在
Ada.Streams.Read通话中。如果您在发送“Hello, World”后完成 Python 端,它会关闭套接字并且 Ada 端完成读取。在这种情况下,您可能需要逐个字符地读取,直到获得终止符。