c - addrinfo 结构在函数调用后不保留值
问题描述
我有一个静态 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
是函数中的局部变量,因此对它的任何更改都不会反映在调用者中。调用者需要传入一个指向指针的指针,而不仅仅是一个指针。将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);
...
}
推荐阅读
- cmake - CMake 调用另一个构建系统
- java - JSP生成文件而不开始空行
- angular - Angular 从代码中删除 @Input 装饰器
- css - CSS 组件和响应式耦合 - 最佳实践?
- android - android studio:依赖错误
- netsuite - Netsuite 保存了对所有联系人(潜在客户、客户)和潜在客户的搜索
- trac - trac 是否有办法跟踪对报告所做的差异或更改?
- android - Prism Xamarin.Forms monoandroid81 添加对“MonoAndroid”的引用
- android - 可选择在应用中使用 Cloud Firestore
- php - php 和 mongodb - 将结果作为公共数组集合获取