From: "Jacob M. H. Smith" <jacob.m.h.smith@googlemail.com>
Subject: GNAT.Sockets. Blocking?
Date: Tue, 23 Jun 2009 14:06:35 -0700 (PDT)
Date: 2009-06-23T14:06:35-07:00 [thread overview]
Message-ID: <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com> (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;
next reply other threads:[~2009-06-23 21:06 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-23 21:06 Jacob M. H. Smith [this message]
2009-06-24 0:14 ` GNAT.Sockets. Blocking? 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
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox