Alex Elderson wrote:

>The problem is the "Connection: Close\n\n" header. The webserver close the connection 
>after the first request, if i remove 
>the "Connection: Close\n\n" header the first fgets($web_conn, 128) command will never 
>ends.
>
This is because persistent TCP connections are the default behavior of 
HTTP/1.1. In HTTP/1.0, the client had to specifically request a 
persistent connection via the use of a "Connection: Keep-Alive" header 
in the HTTP request. Now (HTTP/1.1) it is quite the opposite; the client 
must specifically request for the server to close the connection with a 
"Connection: Close" header in the HTTP request.

What is happening for you is this:
1) you use PHP socket functions to manually generate an HTTP request to 
a remote Web server
2) The Web server responds to your request and likely includes a 
"Connection: Close" header in the response. It does not, however, close 
the connection itself. It is simply letting you know that it is finished.
3) You do not parse the response or close the connection. You just sit 
there, and thus, nothing happens until a timeout condition is reached.

You are basically implementing a primitive Web client, which is a very 
rewarding experience in terms of the education you provide yourself. It 
requires you, however, to deal with many details of socket programming. 
By leaving the socket open, you are able to send additional HTTP 
requests without all of the overhead of creating/destroying a socket for 
each transaction. This is extremely helpful, of course, for Web pages 
that include several images, so the GET requests for those images can be 
sent on the same connection. Additionally, you can now pipeline your 
requests; you do not have to wait for a response before issuing your 
next request.

If you simply want to make a single request, receive the response, and 
have the connection be terminated, go ahead and include the "Connection: 
Close" header in your HTTP request, and this will request that the Web 
server close the connection for you. Otherwise, you'll need to do it for 
yourself. To close the connection yourself, you need to know when the 
server is finished sending, correct? You do this in two steps:

1) The header portion of the response is terminated by \r\n\r\n (though 
you should be prepared to accept just \n\n).
2) You read exactly how many bytes were specified in the 
"Content-Length" header and close the connection when you receive that.

That's a basic introduction into the semantics of what you're getting 
into. If you still need more information, feel free to ask more 
questions; I enjoy explaining HTTP. Copy me on any responses if you want 
to ensure that I'll not miss your message.

Cheers.

Chris


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to