C - HTTP Socket Programming

Right:)

After a bit of researching and editing, I have come up with this for my client.c:

#include <stdio.h>      /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
#include <arpa/inet.h>  /* for sockaddr_in and inet_addr() */
#include <stdlib.h>     /* for atoi() and exit() */
#include <string.h>     /* for memset() */
#include <unistd.h>     /* for close() */
#include <netdb.h>

#define RCVBUFSIZE 64   /* Size of receive buffer */
#define PORT 80
#define USERAGENT "HTMLGET 1.0"

void DieWithError(char *errorMessage);  /* Error handling function */

int main(int argc, char *argv[])
{
    int sock;                        /* Socket descriptor */
    struct sockaddr_in echoServAddr; /* Echo server address */
    unsigned short echoServPort;     /* Echo server port */
    char *servIP;                    /* Server IP address (dotted quad) */
    char *echoString;                /* String to send to echo server */
    char echoBuffer[RCVBUFSIZE];     /* Buffer for echo string */
    unsigned int echoStringLen;      /* Length of string to echo */
    int bytesRcvd, totalBytesRcvd;   /* Bytes read in single recv() 
                                        and total bytes read */
   
   
    if ((argc < 3) || (argc > 4))    /* Test for correct number of arguments */
    {
      
      fprintf(stderr, "Usage: %s <servername> <message> <Echo Port>\n",
               argv[0]);
       exit(1);
    }


    servIP = argv[1];             /* First arg: server IP address (dotted quad) */
    

    if (argc == 4)
        echoServPort = atoi(argv[3]); /* Use given port, if any */
    else
        echoServPort = 7;  /* 7 is the well-known port for the echo service */

    /* Create a reliable, stream socket using TCP */
    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        DieWithError("socket() failed");

    /* If connected then send the message */
    if ( connect(sock, (struct sockaddr*)&echoServAddr, sizeof(echoServAddr)) == 0)
    {    char s[200];
        FILE *fp = fdopen(sock, "r+");       /* convert into stream */

        fprintf(fp, argv[2]);                     /* send request */
        fprintf(fp, "\n\n");                 /* add some newlines */
        fflush(fp);                          /* ensure it got out */
        while ( fgets(s, sizeof(s), fp) != 0 )/* while not EOF ...*/
            fputs(s, stdout);                /*... print the data */
        fclose(fp);                           /* close the socket */
    }
    
    /* Construct the server address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));     /* Zero out structure */
    echoServAddr.sin_family      = AF_INET;             /* Internet address family */     
    echoServAddr.sin_addr.s_addr = inet_addr(servIP);   /* Server IP address */
    echoServAddr.sin_port        = htons(echoServPort); /* Server port */

    /* Establish the connection to the echo server */ 
    if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 
        DieWithError("connect() failed"); 
    echoStringLen = strlen(echoString);          /* Determine input length */ 
 
    /* Send the string to the server */ 
    if (send(sock, echoString, echoStringLen, 0) != echoStringLen) 
        DieWithError("send() sent a different number of bytes than expected"); 
 
    /* Receive the same string back from the server */ 
    totalBytesRcvd = 0; 
    printf("Received: ");                /* Setup to print the echoed string */ 
    while (totalBytesRcvd < echoStringLen) 
    { 
        /* Receive up to the buffer size (minus 1 to leave space for 
           a null terminator) bytes from the sender */ 
        if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0) 
            DieWithError("recv() failed or connection closed prematurely"); 
        totalBytesRcvd += bytesRcvd;   /* Keep tally of total bytes */ 
        echoBuffer[bytesRcvd] = '\0';  /* Terminate the string! */ 
        printf("%s", echoBuffer);      /* Print the echo buffer */ 
    } 
 
    printf("\n");    /* Print a final linefeed */ 
 
    close(sock); 
    exit(0); 
}//-- end main --// 
 
 
 
// 
//// 
// 
void DieWithError(char *errorMessage) 
{ 
    perror(errorMessage); 
    exit(1); 
}

But..........
It is complaining about line 53.
This is the warning it gives me

Line 53 is

fprintf(fp, argv[2]);                     /* send request */

Could you please check!!!

Thanks

Try fprintf(fp, "%s", argv[2]); fprintf's second parameter is a string telling it how to print the arguments after it.

Yep it worked!:smiley:
Now, onto my web-server.

Just as a opinion, do you reckon my client code will work?

My intention is to input the following:

and get back the html content of the file from the webserver.

Please advice!

It will need to send \r\n\r\n after it sends the string. HTTP is not quite that simple, no; this may work in ideal circumstances but will break when a web server responds with authentication requests, error messages, or multi-part responses. You may also end up with HTTP headers inside the output.