String 可提取元素的Ada字符串流计数
我想写一个程序,用来发送http请求并从服务器接收整个响应。我还想借助Ada Streams(而不是Send_Socket/Receive_Socket和Stream_元素_Vector与字符串之间的数据转换)来完成这项工作 我的问题是:如何检测流是否为空?我之所以想这样做,是因为当我试图读取比流包含的数据更多的数据时,操作String'read会自动挂起。我无法确定响应的大小 目前,我的代码如下所示:String 可提取元素的Ada字符串流计数,string,networking,stream,ada,String,Networking,Stream,Ada,我想写一个程序,用来发送http请求并从服务器接收整个响应。我还想借助Ada Streams(而不是Send_Socket/Receive_Socket和Stream_元素_Vector与字符串之间的数据转换)来完成这项工作 我的问题是:如何检测流是否为空?我之所以想这样做,是因为当我试图读取比流包含的数据更多的数据时,操作String'read会自动挂起。我无法确定响应的大小 目前,我的代码如下所示: with Ada.Text_IO; with GNAT.Sockets; with Ada.
with Ada.Text_IO;
with GNAT.Sockets;
with Ada.Strings.Unbounded;
procedure sockets is
package to renames Ada.Text_IO;
package s renames GNAT.Sockets;
package su renames Ada.Strings.Unbounded;
host : constant String := "www.google.pl";
HTTP_PORT : constant s.PORT_TYPE := 80;
task ping is
entry start;
entry stop;
end ping;
task body ping is
query : su.Unbounded_String := su.To_Unbounded_String("");
host2 : su.Unbounded_String;
Address : s.Sock_Addr_Type;
Socket : s.Socket_Type;
Channel : s.Stream_Access;
cr : constant Character := Character'Val(13);
lf : constant Character := Character'Val(10);
new_line : constant String := (cr, lf);
output : String (1 .. 4096);
begin
to.Put("Ala");
to.Put(new_line);
to.Put("Kot");
accept start;
Address.Addr := s.Addresses (s.Get_Host_By_Name (host), 1);
Address.Port := HTTP_PORT;
s.Create_Socket (Socket);
s.Set_Socket_Option (
Socket,
s.Socket_Level,
(s.Reuse_Address, True));
delay 0.2;
to.Put_Line("Lacze z hostem");
s.Connect_Socket(Socket, Address);
Channel := s.Stream (Socket);
to.Put_Line("Wysylam dane");
su.Append(query, "GET / HTTP/1.1");
su.Append(query, new_line);
su.Append(query, "Host: ");
su.Append(query, host);
su.Append(query, new_Line);
su.Append(query, new_line);
String'Write (Channel, su.To_String(query));
to.Put_Line("Odbieram dane");
String'Read (Channel, output);
to.Put(output);
to.Put_Line("Zamykam gniazdo");
s.Close_Socket(Socket);
accept stop;
to.Put_Line("ping stopped");
end ping;
begin
to.Put_Line("Hello World!!!");
ping.start;
ping.stop;
end sockets;
XML/Ada已经包含一个从http流读取文件的实现。查看XML/Ada发行版中的文件input_sources-http.adb,以获取一个示例,说明如何按定义阻塞Ada流。如果要使用流属性,必须知道有多少数据到达流上
PS:是另一个使用HTTP的库。面向流的属性不是用于此的合适工具
'Read
必须始终在开始时知道需要读取多少字节'Input
将在开始读取字符串之前从流中读取有关字符串
边界的信息,但该信息必须存在(并且不会出现在HTTP响应中)。如果读卡器无法立即知道需要读取多少字节,则不能使用'read
或'Input
,但可以使用Ada.Streams.read
(RM 13.13.1)。