String 可提取元素的Ada字符串流计数

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.

我想写一个程序,用来发送http请求并从服务器接收整个响应。我还想借助Ada Streams(而不是Send_Socket/Receive_Socket和Stream_元素_Vector与字符串之间的数据转换)来完成这项工作

我的问题是:如何检测流是否为空?我之所以想这样做,是因为当我试图读取比流包含的数据更多的数据时,操作String'read会自动挂起。我无法确定响应的大小

目前,我的代码如下所示:

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