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!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 13:32:19 GMT NNTP-Posting-Host: 12.64.134.242 X-Complaints-To: abuse@worldnet.att.net X-Trace: bgtnsc05-news.ops.worldnet.att.net 1245850339 12.64.134.242 (Wed, 24 Jun 2009 13:32:19 GMT) NNTP-Posting-Date: Wed, 24 Jun 2009 13:32:19 GMT Organization: AT&T Worldnet Xref: g2news2.google.com comp.lang.ada:6594 Date: 2009-06-24T13:32:19+00:00 List-Id: I have a couple of programs that preform this type of task. First, web pages begin with "" and normally end with "". Second, each server can be set to use a block size for the page that may be 256B, 1KB or 4KB. But in some rare cases the server can use odd sizes. Use the unsecure "Telnel :80" to see what info you will need to process. Also, some servers (Like the Microsoft Servers) to prevent robot or programs like this, request some browsers information or they close the connection. And some servers or web pages like 'google" use cookies. And for some server that have Ads, if these are not downloaded and a cookie set can block the complete page from be transmitted. And if you play with 'PingPong" a program commented in GNAT.Sockets specification file (g-socket.ads) you will se that if you alter the string size it will cause the prograsm to block. A basic outline for this type of program is: <> Get_String -- Reads a set characters and build a string -- from socket <> Get_Web_Page -- Read a Web page from the net ... Line := 1 ; Open connection loop Input := Get_String until Input = "" loop -- Should be first string Page ( Line ) := Input Line := Line + 1 ; while Input /= "" loop -- Should be last string Input := Get_String Page ( Line ) := Input Line := Line + 1 ; end loop Close connection ... return Page -- At this point Page is array of variable lengths -- strings that contains => "" ... "" exception when Socket_Error => -- Server close connection -- Process corrupted page??? when Timeout => -- May be needed if Server stop transmitting close connection -- Process corrupted page??? 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;