Previous: Implementing a ‘display_result’ Function, Up: Steps in Implementing an Insecure HTTP Client [Index]
The main routine that coordinates all of this is shown in Listing 1-3.
/**
* Simple command-line HTTP client.
*/
int main( int argc, char *argv[ ] )
{
int client_connection;
char *host, *path;
struct hostent *host_name;
struct sockaddr_in host_address;
if ( argc < 2 )
{
fprintf( stderr, "Usage: %s: <URL>\n", argv[ 0 ] );
return 1;
}
if ( parse_url( argv[ 1 ], &host, &path ) == -1 )
{
fprintf( stderr, "Error - malformed URL '%s . \n", argv[ 1 ] );
return 1;
}
printf( "Conecting to host '%s'\n", host );
Listing 1.5: "http.c" main
After the URL has been parsed and the host is known, you must establish a
socket to it. In order to do this, convert it from a human-readable host name,
as ‘www.server.com’, to a dotted-decimal IP address, such as ‘100.218.64.2’.
You call the standard gethostbyname library function to do this, and connect
to the server. This is shown in Listing 1-4.
// Step 1: open a socket connection on http port with the destination host
client_connection = socket( PF_INET, SOCK_STREAM, 0 );
if ( !client_connection )
{
perror( "Unable to create a local socket" );
return 2;
}
host_name = gethostbyname( host );
if ( !host_name )
{
perror( "Error in name resolution" );
return 3;
}
host_address.sin_family = AF_INET;
host_address.sin_port = htons( HTTP_PORT );
memcpy( &host_address.sin_addr, host_name->h_addr_list[ 0 ],
sizeof( struct in_addr ) );
if ( connect( client_connection, ( struct sockaddr * ) &host_address,
sizeof( host_address ) ) == -1 )
{
perror( "Unable to connect to host" );
return 4;
}
printf( "Retrieving document: '%s'\n", path );
Listing 1.6: "http.c" main (continued)
Assuming nothing went wrong:
You now have a usable (cleartext) socket with which to exchange data with the web server. Issue a ‘GET’ command, display the result, and close the socket, as shown in Listing 1-5.
// Step 2: Issue a GET command
http_get( client_connection, path, host );
display_result( client_connection );
printf( "Shutting down.\n" );
if (close( client_connection ) == -1 )
{
perror( "Error closing client connection" );
return 5;
}
return 0;
}
Listing 1.7: "http.c" main-continued-2