//===================================================== file = httpget1.c =====
//= A client program to connect to a Web server and do one HTTP GET =
//= - Outputs the GET response =
//=============================================================================
//= Notes: =
//= 1) This program conditionally compiles for Winsock and BSD sockets. =
//= Set the initial #define to WIN or BSD as appropriate. =
//= 2) This program hardwires the IP address of www.grad.csee.usf in the =
//= #define IP_ADDR and hardwires the GET request string into =
//= #define GET_STRING. =
//=---------------------------------------------------------------------------=
//= Output from an execution (hardwired to get Christensen homepage): =
//= =
//= HTTP/1.1 200 OK =
//= Date: Wed, 20 Dec 2000 03:17:18 GMT =
//= Server: Apache/1.3.6 (Unix) =
//= Last-Modified: Sat, 16 Dec 2000 00:14:59 GMT =
//= ETag: "25998c-340c-3a3ab403" =
//= Accept-Ranges: bytes =
//= Content-Length: 13324 =
//= Connection: close =
//= Content-Type: text/html =
//= =
//=
=
//= Homepage for Kenneth J. Christensen =
//= =
//= =
//=
=
//= =
//= --- SNIP SNIP --- =
//= =
//=
=
//= =
//= =
//= Last updated by =
//= Ken Christensen on DECEMBER 15, 2000 =
//= =
//= =
//= =
//=---------------------------------------------------------------------------=
//= Build: bcc32 httpget1.c, cl httpget1.c wsock32.lib, =
//= gcc httpget1.c -lsocket -lnsl =
//=---------------------------------------------------------------------------=
//= Execute: httpget1 =
//=---------------------------------------------------------------------------=
//= History: KJC (01/04/01) - Genesis (from client.c) =
//=============================================================================
#define WIN // WIN for Winsock and BSD for BSD sockets
//----- Include files ---------------------------------------------------------
#include // Needed for printf()
#include // Needed for exit()
#include // Needed for strcpy() and strlen()
#ifdef WIN
#include // Needed for all Winsock stuff
#endif
#ifdef BSD
#include // Needed for system defined identifiers.
#include // Needed for internet address structure.
#include // Needed for socket(), bind(), etc...
#include // Needed for inet_ntoa()
#include
#include
#endif
//----- Defines ---------------------------------------------------------------
#define BUF_SIZE 4096 // Buffer size
#define PORT_NUM 80 // Web servers are at port 80
#define IP_ADDR "131.247.3.1" // IP address of www.csee.usf.edu
#define GET_STRING "GET /~christen/index.html HTTP/1.0\n\n" // GET string
//===== Main program ==========================================================
void main(void)
{
#ifdef WIN
WORD wVersionRequested = MAKEWORD(1,1); // Stuff for WSA functions
WSADATA wsaData; // Stuff for WSA functions
#endif
unsigned int server_s; // Server socket descriptor
struct sockaddr_in server_addr; // Server Internet address
char out_buf[BUF_SIZE]; // Output buffer for GET request
char in_buf[BUF_SIZE]; // Input buffer for response
unsigned int retcode; // Return code
unsigned int i; // Loop counter
#ifdef WIN
// This stuff initializes winsock
WSAStartup(wVersionRequested, &wsaData);
#endif
// Create a socket
server_s = socket(AF_INET, SOCK_STREAM, 0);
// Fill-in the Web server socket's address information
server_addr.sin_family = AF_INET; // Address family to use
server_addr.sin_port = htons(PORT_NUM); // Port num to use
server_addr.sin_addr.s_addr = inet_addr(IP_ADDR); // IP address to use
// Do a connect (connect() blocks)
retcode = connect(server_s, (struct sockaddr *)&server_addr,
sizeof(server_addr));
if (retcode != 0)
{
printf("ERROR - connect() failed \n");
exit(1);
}
// Send a GET to the Web server
strcpy(out_buf, GET_STRING);
send(server_s, out_buf, strlen(out_buf), 0);
// Receive from the Web server
// - The return code from recv() is the number of bytes received
retcode = recv(server_s, in_buf, BUF_SIZE, 0);
while ((retcode > 0) || (retcode == -1))
{
if (retcode == -1)
{
printf("ERROR - recv() failed \n");
exit(1);
}
for (i=0; i