将sockaddr从getaddrinfo保存到sockaddr_storage

时间:2018-02-22 07:53:56

标签: c network-programming

我尝试用C编写IPv4 / IPv6不可知程序。getaddrinfo的第3个参数设置为AF_UNSPEC,因此结果可能是IPv4或IPv6。我想将结果保存到struct sockaddr_storage,以便我以后可以重复使用它。这就是我正在做的事情:

static int init_server(const char *hostname, const char *proto, const char *port, struct sockaddr_storage *serv_addr)
{
    struct addrinfo *addr;
    struct addrinfo hints;
    int rc;

    memset(&hints, 0, sizeof(hints));

    if (!strcmp(proto, "tcp")) {
        hints.ai_socktype = SOCK_STREAM;
    } else if (!strcmp(proto, "udp")) {
        hints.ai_socktype = SOCK_DGRAM;
    } else {
        return 1;
    }

    hints.ai_family = AF_UNSPEC;
    hints.ai_flags = AI_PASSIVE;

    rc = getaddrinfo(hostname, port, &hints, &addr);
    if (rc != 0) {
        return 1;
    }

    memset(serv_addr, 0, sizeof(*serv_addr));
    memcpy(serv_addr, addr->ai_addr, addr->ai_addrlen);

    freeaddrinfo(addr);

    return 0;
}

我是否正确复制了结果?我发现C socket相关的结构令人困惑,所以这可能完全是胡说八道。

0 个答案:

没有答案