From: anon@anon.org (anon)
Subject: Re: GNAT.Sockets. Blocking?
Date: Wed, 24 Jun 2009 14:03:28 GMT
Date: 2009-06-24T14:03:28+00:00 [thread overview]
Message-ID: <Qmq0m.391917$4m1.193188@bgtnsc05-news.ops.worldnet.att.net> (raw)
In-Reply-To: 158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com
Also, each Web Page must be open downloaded and then close. and reopen,
upload requested information wait download result then close. That is, if you
want to read 10 pages you must open read and close the page 10 times. Its
just the protocol that is used to access the internet based on a number of RFC.
To really learn how to access this you should install a server like Apache and
GNAT's AWS and build a simple set set of web pages. Write and test your
program on that server instead of causing problems with an active online
server.
In <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com>, "Jacob M. H. Smith" <jacob.m.h.smith@googlemail.com> writes:
>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 14:03 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 [this message]
2009-06-24 15:14 ` Pascal Obry
2009-06-24 18:44 ` Simple solution was " anon
2009-06-24 18:47 ` Per Sandberg
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