gpt4 book ai didi

c - 函数调用后addrinfo结构不保留值

转载 作者:行者123 更新时间:2023-12-03 11:51:35 25 4
gpt4 key购买 nike

我有一个静态addrinfo结构,用于在静态函数init_socket()中保存对getaddressinfo()的调用结果。在init_socket()内部,addrinfo结构具有正确的值,但在返回时将其清零。
下面是我要完成的代码。

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
...
}



最佳答案

resInfo是函数中的局部变量,因此对它的任何更改都不会反射(reflect)在调用方中。调用者需要将一个指针传递给一个指针,而不仅仅是一个指针。 getaddinfo将分配动态内存。是的,这有点令人困惑,因此请查看以下更正后的代码,希望可以使其更清晰。

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);
...
}

关于c - 函数调用后addrinfo结构不保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62905514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com