2012-09-04 78 views
6

我有這個簡單的客戶端 - 服務器應用程序對。代碼很簡單,我只使用新的建議的方法,如getaddinfo等,一切工作正常的ipv4。即使對於ipv6 loopback(:: 1)也是如此。問題開始涉及到其他ipv6地址...我有兩臺機器在網絡中,一切正常,當我通過他們的ipv4地址,但當我給我的客戶ipv6地址,我得到一個連接函數的錯誤:無效參數。 嘿,我不知道這個?我做!當我嘗試ping6這個IPv6地址,我得到了同樣的錯誤:connect()返回「無效參數」與ipv6地址

connect: Invalid argument

但是有一個方法來克服此塊 - 應該選擇一個-I開關的接口,這一切,因爲運行順利然後。但是我如何在我的客戶端應用程序中實現相同的功能?我該怎麼辦?我的客戶端代碼如下所示:

struct addrinfo hints; 
struct addrinfo *server; 

memset(&hints, 0, sizeof(hints)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

int status; 
if((status = getaddrinfo(argv[1], argv[2], &hints, &server) != 0)) 
{ 
    perror("getaddrinfo error"); 
    return 1; 
} 

int sock_fd; 
struct addrinfo *ptr; 
for(ptr=server;ptr!=NULL;ptr=ptr->ai_next) 
{ 
    if((sock_fd = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol)) == -1) 
    { 
     perror("socket error"); 
     continue; 
    } 
    if(connect(sock_fd, ptr->ai_addr,ptr->ai_addrlen) == -1) 
    { 
     perror("connect error"); 
     continue;  
    } 
    break; 
} 
+1

這是ping拒絕的有問題的地址是什麼? – Ariel

+0

我在ping我的網絡中的其他機器,但它對所有ipv6地址的作用相同 - 請檢查: http://lists.debian.org/debian-ipv6/2005/06/msg00044.html – flyjohny

+0

@flyjohny也許你應該檢查你的路線看看是否默認路由是一個ip6路由命令:「route -A inet6」 –

回答

5

ff...開頭的地址是組播地址。將流連接到多播地址不起作用。

fe80...的地址是鏈路本地地址,它們具有與其相關聯的接口標識符。試試看從getaddrinfo返回,是scope字段填寫?

+0

它被填充0.地址確實以fe80開頭...... – flyjohny

+2

該字段應包含接口號。你是否用'%eth0'或'%1'指定了範圍(1是接口號,你可以用'ip'工具查找)符號?\ –

+0

不可以。當我這樣做時,這個範圍字段充滿了一些價值,它似乎工作(雖然我需要配置我的具體固件,但我沒有得到任何無效論點)。 但我似乎錯過了所有與ipv6相關的資料我正在讀我沒有遇到過這種情況 - 我需要指定接口,每當我使用鏈接本地地址? – flyjohny

0

我的建議是,你打開的接口/網絡連接IP6的協議,除了扔出去的ip4的協議,如果你仍然有錯誤。

在我的Linux機箱上,當我有一個ip4接口活動並且我的應用程序試圖使用ip4接口和ip6設置時,也發生了這種情況。對於Windows也一樣。

如果有什麼不明確的問。

+0

我知道我是懶惰的屁股,但你能告訴我如何打開接口中的ip6協議?我正在使用Linux機器。 – flyjohny

+0

首先查看本指南http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x790。html之後,請在您的特定界面上嘗試以下操作:ping6 -I eth0「在此處填寫ip6addr」可能是因爲您的環回接口已啓用ip6支持,因此本地ping無任何問題,您可以告訴我們您的Linux發行版和內核版本? –

6

你需要指定的IPv6平(即-I eth0)中的界面:

ping6 -I eth0 fe80::208:54ff:fe34:22ae 

使用鏈路本地地址的IPv6平,需要定義它必須發送什麼設備/接收數據包 - 每個設備都有一個鏈接本地地址。

沒有這種嘗試,將導致錯誤信息,如:

--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument 

在這種情況下,你必須另行指定接口一樣所示:

--> # ping6 -I eth0 fe80::208:54ff:fe34:22ae 
PING fe80::208:54ff:fe34:22ae(fe80::208:54ff:fe34:22ae) from fe80::208:54ff:fe34:22ae eth0: 56 data bytes 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=0 ttl=64 time=0.027 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=1 ttl=64 time=0.030 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=2 ttl=64 time=0.036 ms 

一個類似的方法你必須遵循在您的客戶端應用程序中。