codice:
/*
** http.c -- a stream socket HTTP client demo
*/

/*Uncomment for your system*/
/*#define LINUX 1*/
/*#define WINDOWS 1*/

#ifdef LINUX
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#endif
#ifdef WINDOWS
#include <winsock.h>
#endif

#define PORT 80 // the port client will be connecting to 

#define MAXDATASIZE 1024 // max number of bytes we can get at once 
#define HTTP_GET "GET %s HTTP/1.1\nHost: %s\n\n"

int main(int argc, char *argv[])
{
#ifdef WINDOWS
    WSADATA wsaData;
#endif
    int sockfd, numbytes, length;  
    char buf[MAXDATASIZE];
    char request[196];
    char *response = NULL;
    struct hostent *he;
    struct sockaddr_in their_addr; // connector's address information 

    if (argc != 2) {
        fprintf(stderr, "Usage:\t%s <hostname> <path>\n", argv[0]);
        exit(1);
    }
#ifdef WINDOWS
     if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        fprintf(stderr, "WSAStartup failed.\n");
        exit(1);
    }
#endif

    if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info 
        herror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    their_addr.sin_family = AF_INET;    // host byte order 
    their_addr.sin_port = htons(PORT);  // short, network byte order 
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);

    if (connect(sockfd, (struct sockaddr *)&their_addr,
                                          sizeof their_addr) == -1) {
        perror("connect");
        exit(1);
    }

   sprintf(request, HTTP_GET, argv[2], argv[1]);

   if ((numbytes=send(sockfd, request, strlen(request), 0)) == -1) {
        perror("send");
        exit(1);
    }
    
    if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
        perror("recv");
        exit(1);
    }

    buf[numbytes] = '\0';

    sscanf(buf, "Content-Length: %d", &length);

    response = (char*)malloc(sizeof(char)*length);

    for(; numbytes < length; numbytes += recv(sockfd, buf, MAXDATASIZE-1, 0)){
    
       strcat(response, buf);
       buf[numbytes] = '\0';
    
    }

    printf("%s\n",response);

    free(response);

#ifdef LINUX
    close(sockfd);
#else
    WSACleanup();
#endif

    return 0;
}
Ci ho provato,
non so se funzioni,
so che è pieno di errori,
ma credo che sia un punto di partenza.