From: Per Sandberg <per.sandberg@bredband.net>
Subject: Re: GNAT.Sockets. Blocking?
Date: Wed, 24 Jun 2009 20:47:47 +0200
Date: 2009-06-24T20:47:47+02:00 [thread overview]
Message-ID: <Llv0m.57124$kh1.47752@newsfe07.ams2> (raw)
In-Reply-To: <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com>
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;
next prev parent reply other threads:[~2009-06-24 18:47 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-23 21:06 GNAT.Sockets. Blocking? Jacob M. H. Smith
2009-06-24 0:14 ` John B. Matthews
2009-06-24 4:55 ` Jacob M. H. Smith
2009-06-24 14:36 ` John B. Matthews
2009-06-24 7:47 ` Dmitry A. Kazakov
2009-06-24 13:32 ` anon
2009-06-24 14:03 ` anon
2009-06-24 15:14 ` Pascal Obry
2009-06-24 18:44 ` Simple solution was " anon
2009-06-24 18:47 ` Per Sandberg [this message]
2009-06-24 19:51 ` Pascal Obry
2009-06-24 22:12 ` Jeffrey R. Carter
2009-06-25 17:30 ` Jacob M. H. Smith
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox