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=1.7 required=5.0 tests=BAYES_00,PDS_OTHER_BAD_TLD, REPLYTO_WITHOUT_TO_CC 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!news1.google.com!news.glorb.com!news2.glorb.com!wn13feed!worldnet.att.net!bgtnsc04-news.ops.worldnet.att.net.POSTED!53ab2750!not-for-mail Newsgroups: comp.lang.ada From: anon@anon.org (anon) Subject: Simple solution was Re: GNAT.Sockets. Blocking? Reply-To: anon@anon.org (anon) References: <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com> X-Newsreader: IBM NewsReader/2 2.0 Message-ID: Date: Wed, 24 Jun 2009 18:44:26 GMT NNTP-Posting-Host: 12.64.186.152 X-Complaints-To: abuse@worldnet.att.net X-Trace: bgtnsc04-news.ops.worldnet.att.net 1245869066 12.64.186.152 (Wed, 24 Jun 2009 18:44:26 GMT) NNTP-Posting-Date: Wed, 24 Jun 2009 18:44:26 GMT Organization: AT&T Worldnet Xref: g2news2.google.com comp.lang.ada:6600 Date: 2009-06-24T18:44:26+00:00 List-Id: Here a simple correction of your program that can be use to download any web site ( 1..8KB ) from any web server that does not request the browser information befoere sending data. Then it dumps the web page to the Standard_Output. Please note: the change in the Http request packet. String'Write ( Channel, "GET /" & CRLF & "Host: " & HOST & CRLF & "Content-Type" & CRLF & CRLF ) ; Also, I limited the initial web page to 1 .. 8192. Easy adaptable to increase buffer size before searching buffer for commands or data references. That is needed to resend the next request. -- -- Socket_Test -- with Ada.Text_IO; 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. exception when GNAT.Sockets.Socket_Error => Ada.Text_IO.Put_line ( "Error in connecting to Server" ) ; end Connect ; 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 ; Buffer : String ( 1..8196 ) ; Byte_Count : Natural ; begin -- Initialize. No longer used in GNAT 2009 -- Not really needed in others versions either -- GNAT.Sockets.Initialize ; -- Connect. Connect ( Socket, Channel, "www.google.com", HTTP_PORT ) ; -- Send HTTP request. String'Write ( Channel, "GET /" & CRLF & "Host: " & HOST & CRLF & "Content-Type" & CRLF & CRLF ) ; -- Get Web page begin Byte_Count := 0 ; for Index in Buffer'Range loop Byte_Count := Byte_Count + 1 ; Character'Read ( Channel, Buffer ( Byte_Count ) ) ; end loop ; exception -- Normal exit if page is less than 8K when END_Error => Byte_Count := Byte_Count - 1 ; end ; if Byte_Count > 0 then Ada.Text_IO.Put_Line ( Buffer ( 1 .. Byte_Count ) ) ; end if ; GNAT.Sockets.Close_Socket ( Socket ) ; end Socket_Test ; In <158756da-21b7-4e2d-b288-7ba030f1f35c@25g2000yqb.googlegroups.com>, "Jacob M. H. Smith" 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;