I have the following code that I have written which is suppose to send a simple http request over a TCP socket, I get a response but as soon as I try to read in the loop it hangs, in the 2nd read operation (tried it manually)
if anyone has an idea of why this might fail I will appreciate it a lot
attached below is the entire code
I am running the program like this: ./http_client yahoo.com
I get this response text at first:
HTTP/1.1 301 Moved Permanently
Date: Sat, 06 Aug 2022 08:07:11 GMT
Connection: keep-alive
Server: ATS
Cache-Control: no-store, no-cache
Content-Type: text/html
Content-Language: en
X-Frame-Options: SAMEORIGIN
Location: https://www.yahoo.com/
Content-Length: 8
redirect
and then it hangs and closes the socket, it shouldn't hang at all, it should run and exit without a delay or anything
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
    int sockfd;
    struct sockaddr_in cli_name;
    struct sockaddr_in *saddr;
    char *hostname;
    struct addrinfo *res;
    int port = 80;
    if (argc != 2) {
        perror("Usage: establish tcp connection to: <hostname>\n");
        exit(1);
    }
    hostname = argv[1];
    printf("Client is alive and establishing socket connection %s.\n", hostname);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error opening channel");
        close(sockfd);
        exit(1);
    }
    if (0 != getaddrinfo(hostname, NULL, NULL, &res)) {
        fprintf(stderr, "Error in resolving hostname %s\n", hostname);
        exit(1);
    }
    bzero(&cli_name, sizeof(cli_name));
    cli_name.sin_family = AF_INET;
    saddr = (struct sockaddr_in *) res->ai_addr;
    cli_name.sin_addr.s_addr = inet_addr(inet_ntoa(saddr->sin_addr));
    cli_name.sin_port = htons(port);
    fflush(stdout);
    if (connect(sockfd, (struct sockaddr *) &cli_name, sizeof(cli_name)) < 0) {
        perror("Error establishing communications");
        close(sockfd);
        exit(1);
    }
    char header[100];
    int cx;
    char buf[2056];
    size_t byte_count = 0;
    size_t sent_byte_count = 0;
    cx = snprintf(header, 100, "GET / HTTP/1.1\r\nHost: %s:%d\r\n\r\n", hostname, port);
    size_t total = strlen(header);
    size_t sent = 0;
    do {
        sent_byte_count = write(sockfd, header + sent, total - sent);
        if (sent_byte_count < 0)
            printf("ERROR writing message to socket");
        if (sent_byte_count == 0)
            break;
        sent += sent_byte_count;
    } while (sent < total);
    memset(buf,0,sizeof(buf));
    while ((byte_count = read(sockfd, buf, 2054)) > 0) {
        buf[byte_count] = '\0';
        printf("%s", buf); // <-- give printf() the actual data size
        fflush(stdout);
    }
    printf("Exiting now.\n");
    close(sockfd);
    exit(0);
}
