Search code examples
csocketsurlgetaddrinfo

getaddrinfo() fails when attempting to download a stream


I'm trying to download a few seconds from a livestream using sockets.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /* close() */
#include <sys/socket.h>
#include <netdb.h>

int main(void)
{
    int sock;
    char host[] = "http://141.138.89.176/fun-1-44-128";
    char port[] = "80";
    struct addrinfo hints, *res;
    char message[] = "GET / HTTP/1.1\nHost: http://141.138.89.176/fun-1-44-128";
    unsigned int i;
    char buf[1024];
    int bytes_read;
    int status;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    status = getaddrinfo(host, port, &hints, &res);
    if (status != 0) {
        perror("getaddrinfo");
        return 1;
    }
    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sock == -1) {
        perror("socket");
        return 1;
    }
    status = connect(sock, res->ai_addr, res->ai_addrlen);
    if (status == -1) {
        perror("connect");
        return 1;
    }
    freeaddrinfo(res);
    send(sock, message, strlen(message), 0);

    do {
        bytes_read = recv(sock, buf, 1024, 0);
        if (bytes_read == -1) {
            perror("recv");
        }
        else {
            printf("%.*s", bytes_read, buf);
        }
    } while (bytes_read > 0);

    close(sock);

    return 0;
}
  

The code compiles, however when running, getaddrinfo() fails. I assume that this means that the host cannot be found.

This is my url: http://141.138.89.176/fun-1-44-128 It works in my browser so I don't know what's going on. Could anyone shed some light on the problem?


Solution

  • I tested your code on my environment and it's perfectly working so your code is surely okay. I recommend checking your compiler, maybe reinstall it.

    EDIT: Okay I think I found the problem. It was that the host should only be the ip address, not the full link.

    (also added a fix to the error reporting from getaddrinfo)

        #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h> /* close() */
    #include <sys/socket.h>
    #include <netdb.h>
    
    int main(void)
    {
        int sock;
        char host[] = "141.138.89.176";
        char port[] = "80";
        struct addrinfo hints, *res;
        char message[] = "GET / HTTP/1.1\nHost: 141.138.89.176/fun-1-44-128";
        unsigned int i;
        char buf[1024];
        int bytes_read;
        int status;
    
        memset(&hints, 0, sizeof hints);
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        status = getaddrinfo(host, port, &hints, &res);
        if (status != 0) {
        printf("Code: %d\n", status);
        printf("Message: %s\n", gai_strerror(status));
            return 1;
        }
    ...