首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >addrinfo结构在函数调用后不保留值

addrinfo结构在函数调用后不保留值
EN

Stack Overflow用户
提问于 2020-07-15 07:37:36
回答 2查看 40关注 0票数 2

我有一个静态的addrinfo结构,用于保存在静态函数init_socket()中调用getaddressinfo()的结果。在init_socket()内部,addrinfo结构具有正确的值,但返回时将其置零。

下面的代码是我试图实现的。

代码语言:javascript
复制
static struct addrinfo rxRes;

static int init_socket(struct addrinfo *resInfo, char *host, char *port) {
    struct addrinfo hints;
    memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    if (!host) { // automatically assign ip to result ip of current machine
        hints.ai_flags = AI_PASSIVE;
    }

    int res = getaddrinfo(host, port, &hints, &resInfo);
    if (res != 0 || !resInfo) {
        PRINT_NET_ERR(res);
        exit(EXIT_FAILURE);
    }

    printf("init addrlen: %d\n", resInfo->ai_addrlen); // correct output

    return socket(resInfo->ai_family, resInfo->ai_socktype, resInfo->ai_protocol);
}

int main(int argc, char *argv[])
{
    /* initialize socket connections */
    int rxsFD = init_socket(&rxRes, TEST_HOST, TEST_PORT);
    printf("main addrlen: %d\n, rxRes.ai_addrlen) // outputs 0
    ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-15 07:49:06

resInfo是函数中的一个局部变量,因此对它的任何更改都不会反映在调用方中。调用者需要传入一个指向指针的指针,而不仅仅是一个指针。getaddinfo将分配动态内存。是的,它有点混乱,所以请看下面更正后的代码,希望能让它更清晰。

代码语言:javascript
复制
static int init_socket(struct addrinfo **resInfo, char *host, char *port) {
    ..   
    int res = getaddrinfo(host, port, &hints, resInfo);
    ..
}

int main(int argc, char *argv[])
{
    struct addrinfo *rxRes;
    /* initialize socket connections */
    int rxsFD = init_socket(&rxRes, TEST_HOST, TEST_PORT);
    printf("main addrlen: %d\n, rxRes->ai_addrlen);

    /* free the result when no longer needed */
    freeaddrinfo(rxRes);
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2020-07-15 08:47:18

补充答案:

我认为您需要使用另一个指针来访问函数init_socket()中的addrinfo struct,以便使用socket()函数实现return

所以你可以这样做:

代码语言:javascript
复制
    struct addrinfo *addrRet = *resInfo;
    printf("initsocket: %d\n", addrRet->ai_addrlen);

    return socket(addrRet->ai_family, addrRet->ai_socktype, addrRet->ai_protocol);

很抱歉我的回答。我不能写评论(没有名声)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62905514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档