From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_00,PDS_OTHER_BAD_TLD autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: a07f3367d7,8a39a73d0242ca42 X-Google-Attributes: gida07f3367d7,public,usenet X-Google-NewGroupId: yes X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!news4.google.com!feeder1-2.proxad.net!proxad.net!feeder1-1.proxad.net!feeder.news-service.com!eweka.nl!hq-usenetpeers.eweka.nl!cyclone03.ams2.highwinds-media.com!news.highwinds-media.com!npeersf01.ams.highwinds-media.com!newsfe07.ams2.POSTED!40385e62!not-for-mail From: Per Sandberg User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: GNAT.Sockets. Blocking? References: <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com> In-Reply-To: <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Message-ID: X-Complaints-To: abuse@WWWSpace.NET NNTP-Posting-Date: Wed, 24 Jun 2009 19:43:39 UTC Date: Wed, 24 Jun 2009 20:47:47 +0200 Xref: g2news2.google.com comp.lang.ada:6601 Date: 2009-06-24T20:47:47+02:00 List-Id: Why not just be lazy?? The folowing 10 lines will achive the same as your 64. ----------------------------- with Ada.Text_IO; with AWS.Client; with AWS.Response; procedure ThttpGet is begin Ada.Text_IO.Put_Line (AWS.Response.Message_Body (AWS.Client.Get (URL => "http://www.google.com"))); end ThttpGet ------------------------------- /Per Jacob M. H. Smith wrote: > Hi, > > I'm kind of new to socket programming and I need some help here. I > wrote a simple little program that just fetches Google's index page. > The posted code works, but only because I used a "Connection: close" > header in the HTTP request. How would set up my code responsible for > reading the data from the stream so that I can read the page while > keeping the connection open? If I remove the header the program seems > to stop when calling the Ada.Streams.Read function if there is less > than BUFFER_SIZE data in the streams buffer. Can't I just read as much > as is available? > > Thanks in advance. > > Here's the code: > > ------------------- > > with Ada.Text_IO; > with Ada.Streams; > with GNAT.Sockets; > > procedure Socket_Test is > > procedure Connect ( > Socket : out GNAT.Sockets.Socket_Type; > Channel : out GNAT.Sockets.Stream_Access; > Host : in String; > Port : in GNAT.Sockets.Port_Type) is > HOST_ENTRY : constant GNAT.Sockets.Host_Entry_Type := > GNAT.Sockets.Get_Host_By_Name (Host); > Address : GNAT.Sockets.Sock_Addr_Type; > begin > -- Prepare the address structure. TODO: make a loop > Address.Addr := GNAT.Sockets.Addresses (HOST_ENTRY, 1); > Address.Port := Port; > -- Set up the connection. > GNAT.Sockets.Create_Socket (Socket); > GNAT.Sockets.Connect_Socket (Socket, Address); > Channel := GNAT.Sockets.Stream (Socket); > -- TODO: error handling. > end Connect; > > use type Ada.Streams.Stream_Element_Count; > > BUFFER_SIZE : constant Ada.Streams.Stream_Element_Count := 256; > HTTP_PORT : constant GNAT.Sockets.Port_Type := 80; > CRLF : constant String := (ASCII.CR, ASCII.LF); > HOST : constant String := "www.google.com"; > > Socket : GNAT.Sockets.Socket_Type; > Channel : GNAT.Sockets.Stream_Access; > Byte_Count : Ada.Streams.Stream_Element_Count; > Buffer : Ada.Streams.Stream_Element_Array (1 .. BUFFER_SIZE); > > begin > > -- Initialize. > GNAT.Sockets.Initialize; > > -- Connect. > Connect (Socket, Channel, "www.google.com", HTTP_PORT); > > -- Send HTTP request. > String'Write (Channel, > "GET / HTTP/1.1" & CRLF & > "Host: " & HOST & CRLF & > "Connection: close" & CRLF & > CRLF); > > -- Read incoming data. > loop > Ada.Streams.Read (Channel.all, Buffer, Byte_Count); > exit when Byte_Count = 0; > for I in 1 .. Byte_Count loop > Ada.Text_IO.Put (Character'Val (Buffer (I))); > end loop; > end loop; > > end Socket_Test;