[英]addrinfo struct not retaining values after function call
我有一個 static addrinfo 結構用於保存我在 static function 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
是 function 中的局部變量,因此對它的任何更改都不會反映在調用者中。 調用者需要傳入一個指向指針的指針,而不僅僅是一個指針。 getaddinfo
將分配動態 memory。 是的,這有點令人困惑,所以請查看以下更正的代碼,希望它更清晰。
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);
...
}
補充答案:
我認為您需要使用另一個指針來訪問 function init_socket()
中的addrinfo struct
,以便使用socket()
function return
。
所以你可以這樣做:
struct addrinfo *addrRet = *resInfo;
printf("initsocket: %d\n", addrRet->ai_addrlen);
return socket(addrRet->ai_family, addrRet->ai_socktype, addrRet->ai_protocol);
對不起,答案。 我不能寫評論(沒有聲譽)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.