1

我正在使用 UNIX 套接字(作为家庭作业的一部分)编写一个 HTTP 客户端。我目前有这个工作代码来连接到给定的 IP 地址:

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
char *server_address = "127.0.0.1";
struct sockaddr_in address;
if (sockfd < 0) {
    printf("Unable to open socket\n"); 
    exit(1);
}

// Try to connect to server_address on port PORT
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(server_address);
address.sin_port = htons(PORT);

if (connect(sockfd, (struct sockaddr*) &address, sizeof(address)) < 0) {
    printf("Unable to connect to host\n");
    exit(1);
}

但是,我现在想修改它,使其server_address也可以是不是 IP 的东西,例如“google.com”。我一直在试图弄清楚如何使用 来做到这一点gethostbyname,但我遇到了麻烦。

gethostbyname 是否会同时接受 IP 地址或“google.com”之类的地址并使其正常工作?(或者我应该先尝试在地址上运行正则表达式,如果它是 IP 地址,则执行其他操作)?

我已尝试使用以下代码尝试使其与“google.com”之类的东西一起使用,但我收到了警告warning: assignment makes integer from pointer without a cast

struct hostent *host_entity = gethostbyname(server_address);
address.sin_addr.s_addr = host_entity->h_addr_list[0];

我知道我做错了,但 gethostbyname 文档很糟糕。

4

1 回答 1

2

你想要的也许是getaddrinfo(3)

#include <sys/socket.h>
#include <netdb.h>

static int
resolve(const char *host, const char *port)
{
        struct addrinfo *aires;
        struct addrinfo hints = {0};
        int s = -1;

        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_flags = 0;
#if defined AI_ADDRCONFIG
        hints.ai_flags |= AI_ADDRCONFIG;
#endif  /* AI_ADDRCONFIG */
#if defined AI_V4MAPPED
        hints.ai_flags |= AI_V4MAPPED;
#endif  /* AI_V4MAPPED */
        hints.ai_protocol = 0;

        if (getaddrinfo(host, port, &hints, &aires) &lt; 0) {
                goto out;
        }
        /* now try them all */
        for (const struct addrinfo *ai = aires;
             ai != NULL &&
                     ((s = socket(ai->ai_family, ai->ai_socktype, 0)) &lt; 0 ||
                      connect(s, ai->ai_addr, ai->ai_addrlen) &lt; 0);
             close(s), s = -1, ai = ai->ai_next);

out:
        freeaddrinfo(aires);
        return s;
}

这个版本让你从主机/端口对中获得一个套接字。它还采用 IP 地址作为主机和服务字符串作为端口。但是,它将已经连接到有问题的主机。

于 2013-02-22T06:32:55.780 回答