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!wn11feed!worldnet.att.net!bgtnsc05-news.ops.worldnet.att.net.POSTED!53ab2750!not-for-mail Newsgroups: comp.lang.ada From: anon@anon.org (anon) Subject: 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 14:03:28 GMT NNTP-Posting-Host: 12.64.134.242 X-Complaints-To: abuse@worldnet.att.net X-Trace: bgtnsc05-news.ops.worldnet.att.net 1245852208 12.64.134.242 (Wed, 24 Jun 2009 14:03:28 GMT) NNTP-Posting-Date: Wed, 24 Jun 2009 14:03:28 GMT Organization: AT&T Worldnet Xref: g2news2.google.com comp.lang.ada:6596 Date: 2009-06-24T14:03:28+00:00 List-Id: 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" 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;