This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Making an HTTP Request.

I followed this sample (github.com/.../http) to try and make a http request. It is not working. Code and output attached below:

#include <zephyr.h>
#include <net/socket.h>
#include <stdio.h>
#include <string.h>

#define HTTP_HOST "google.com"
#define HTTP_PORT 80
#define RECV_BUF_SIZE 8192

char recv_buf[RECV_BUF_SIZE + 1];

int blocking_recv(int fd, uint8_t *buf, uint32_t size, uint32_t flags) {
    int err;
 
    do {
        err = recv(fd, buf, size, flags);
    } while (err < 0 && errno == EAGAIN);

    return err;
}


int blocking_send(int fd, uint8_t *buf, uint32_t size, uint32_t flags) {
    int err;

    do {
        err = send(fd, buf, size, flags);
    } while (err < 0 && errno == EAGAIN);

    return err;
}


int blocking_connect(int fd, struct sockaddr *local_addr, socklen_t len) {
    int err;

    do {
        err = connect(fd, local_addr, len);
    } while (err < 0 && errno == EAGAIN);

    return err;
}

int make_req(char *data) {
    struct sockaddr_in local_addr;
    struct addrinfo *res;

    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(0);
    local_addr.sin_addr.s_addr = 0;

    printk("HTTP example\n\r");

    int err = getaddrinfo(HTTP_HOST, NULL, NULL, &res);


    printk("getaddrinfo err: %d\n\r", err);
    ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(HTTP_PORT);

    char send_buf[] =
            "GET / HTTP/1.1\r\nHost: www.google.com:80\r\nConnection: close\r\n\r\n";
    int send_data_len = strlen(send_buf);

    int client_fd = socket(AF_INET, SOCK_STREAM, 0);

    printk("client_fd: %d\n\r", client_fd);
    err = bind(client_fd, (struct sockaddr *)&local_addr,
               sizeof(local_addr));
    printk("bind err: %d\n\r", err);
    err = blocking_connect(client_fd, (struct sockaddr *)res->ai_addr,
                           sizeof(struct sockaddr_in));
    printk("connect err: %d\n\r", err);

    int num_bytes = send(client_fd, send_buf, send_data_len, 0);

    printk("send err: %d\n\r", num_bytes);

    int tot_num_bytes = 0;


    return err;

}

Output:

error: 0
OK
HTTP example
getaddrinfo err: 0
client_fd: -1
bind err: -1
connect err: -1
send err: -1

Related