我有一个静态的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
...
}发布于 2020-07-15 07:49:06
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);
...
}发布于 2020-07-15 08:47:18
补充答案:
我认为您需要使用另一个指针来访问函数init_socket()中的addrinfo struct,以便使用socket()函数实现return。
所以你可以这样做:
struct addrinfo *addrRet = *resInfo;
printf("initsocket: %d\n", addrRet->ai_addrlen);
return socket(addrRet->ai_family, addrRet->ai_socktype, addrRet->ai_protocol);很抱歉我的回答。我不能写评论(没有名声)。
https://stackoverflow.com/questions/62905514
复制相似问题