comp.lang.ada
 help / color / mirror / Atom feed
* GNAT.Sockets. Blocking?
@ 2009-06-23 21:06 Jacob M. H. Smith
  2009-06-24  0:14 ` John B. Matthews
                   ` (6 more replies)
  0 siblings, 7 replies; 13+ messages in thread
From: Jacob M. H. Smith @ 2009-06-23 21:06 UTC (permalink / raw)


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;



^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2009-06-25 17:30 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
2009-06-24 19:51   ` Pascal Obry
2009-06-24 22:12   ` Jeffrey R. Carter
2009-06-25 17:30     ` Jacob M. H. Smith

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox