2012-03-08 63 views
2

我想補充我的程序支持IPv6和跨奇數錯誤來了。我想打開接受連接的套接字。這是我的情景:錯誤()調用

首先,我使用getaddrinfo()來查找插槽配置:

struct addrinfo hint, *info = NULL; 

memset((void *)&hint, 0, sizeof(hint)); 
hint.ai_family = AF_INET6; 
hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV; 
hint.ai_socktype = SOCK_STREAM; 

if ((error = getaddrinfo(NULL, "1234", &hint, &info))) { 
    /* some error handling */ 
} 

我代非NULL結果info。然後我想創建套接字:

socket(info->ai_family, info->ai_socktype, info->ai_protocol) 

在這裏,我得到-1

strerror(errno) 

回報Address family not supported by protocol

我認爲getaddrinfo()只返回可以綁定,我希望它返回NULL地址在這種情況下。我錯過了什麼?

我想補充一點,我的eth0沒有IPv6地址現在。我使用uClibc的0.9.32

+0

你得到你要求什麼......否則刪除'hint.ai_family = AF_INET6;' – ydroneaud 2012-03-08 14:58:05

回答

1

您需要添加AI_ADDRCONFIG到填上ai_flags,以確保它不會返回內核不支持的地址族。我現在幾乎總是添加那個標誌。

如果你想支持IPv6的無內核,你必須避免ai_family設置爲AF_INET6。相反,您必須監聽所有返回的地址,並確保在AF_INET6上設置IPV6_V6ONLY。不幸的是,不能保證AF_INET6地址會先被返回。

+0

這今天救了我的燻肉!謝謝! – 2015-07-18 20:20:06

+0

@gubblebozer很高興幫助。我想說明的是,現在我總是先嚐試將'AF_INET6'傳遞給getaddrinfo。如果那個或下面的套接字調用失敗,我將回退到'AF_INET'。這是更多的代碼,但有一個單一的偵聽套接字使其他地方更容易(如果你這樣做,確保關閉_off_ IPV6_V6ONLY)。 – 2015-07-19 22:35:32

0

getaddrinfo返回struct addrinfo對象,您可以遍歷使用ai_next成員的鏈表。你應該嘗試每個依次返回addrinfo對象,直到你得到一個連接(或打榜的NULL /結束)。