2012-09-04 29 views
6

के साथ "अमान्य तर्क" देता है मेरे पास यह सरल क्लाइंट-सर्वर एप्लिकेशन जोड़ी है। कोड बहुत आसान है, मैं केवल नए, सलाहकार तरीकों का उपयोग कर रहा हूं जैसे getaddinfo आदि और सब कुछ आईपीवी 4 के लिए ठीक काम करता है। आईपीवी 6 लूपबैक (:: 1) के लिए भी यह काम करता है। जब कुछ अन्य आईपीवी 6 पते की बात आती है तो समस्याएं शुरू होती हैं ... मेरे पास नेटवर्क में दो मशीनें हैं, जब मैं अपने आईपीवी 4 पते पास करता हूं तो सबकुछ ठीक काम करता है, लेकिन जब मैं अपना क्लाइंट आईपीवी 6 पता देता हूं, तो मुझे कनेक्ट फ़ंक्शन पर एक त्रुटि मिलती है: अमान्य तर्क । अरे, क्या मुझे पहले से ही यह पता नहीं है? मैं करता हूँ! मैं ping6 इस IPv6 पता करने के लिए प्रयास करते हैं, मैं एक ही त्रुटि मिलती है:कनेक्ट() ipv6 पता

connect: Invalid argument

लेकिन वहाँ एक तरह से इस ब्लॉक से उबरने के लिए है - एक एक मैं स्विच के साथ एक इंटरफेस का चयन करना चाहिए और यह सब आसानी से के बाद से चलाता है फिर। लेकिन मैं अपने क्लाइंट ऐप में इसे कैसे प्राप्त कर सकता हूं? मुझे क्या करना चाहिए? मेरे क्लाइंट कोड इस तरह दिखता है:

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

यह समस्याग्रस्त पता क्या है जो पिंग अस्वीकार करता है? – Ariel

+0

मैं अपने नेटवर्क में दूसरी मशीन को पिंग कर रहा हूं लेकिन यह सभी आईपीवी 6 एड्रेस के लिए भी काम करता है - इसे जांचें: http://lists.debian.org/debian-ipv6/2005/06/msg00044.html – flyjohny

+0

@flyjohny शायद आप अपने मार्गों को जांचना चाहिए कि डिफ़ॉल्ट मार्ग एक आईपी 6 रूट कमांड है: "रूट-ए इनसेट 6" –

उत्तर

5

ff... से शुरू होने वाले पते मल्टीकास्ट पते हैं। एक मल्टीकास्ट पते पर स्ट्रीम कनेक्ट करना काम नहीं करता है।

fe80... से शुरू होने वाले पते लिंक-स्थानीय पते हैं, जिनमें उनके साथ एक इंटरफेस पहचानकर्ता है। sockaddr पर getaddrinfo से लौटने की कोशिश करें, scope फ़ील्ड भर गया है?

+0

यह 0 से भरा है। पता वास्तव में fe80 के साथ शुरू होता है ... – flyjohny

+2

इस फ़ील्ड में इंटरफ़ेस नंबर होना चाहिए। क्या आपने '% eth0' या'% 1' (1 इंटरफ़ेस नंबर होने के साथ, जिसे आप 'ip' टूल के साथ देख सकते हैं) के साथ दायरा निर्दिष्ट किया है? \ –

+0

नहीं। जब मैं ऐसा करता हूं, तो यह दायरा क्षेत्र कुछ मूल्य से भरा होता है और ऐसा लगता है (हालांकि मुझे अपने विशिष्ट एफडब्ल्यू को कॉन्फ़िगर करने की आवश्यकता है, लेकिन मुझे अब कोई अमान्य तर्क नहीं मिला है)। लेकिन मुझे कुछ याद आ रहा है और आईपीवी 6 से जुड़े सभी सामग्रियों में मैं पढ़ रहा था कि मैं इस पर नहीं आया - क्या मुझे लिंक-स्थानीय पता का उपयोग करने पर इंटरफ़ेस निर्दिष्ट करने की आवश्यकता है? – flyjohny

0

मेरे सिफारिश है कि आप इसके अलावा में, इंटरफ़ेस/नेटवर्क कनेक्शन में ip6 प्रोटोकॉल पर बारी ip4 प्रोटोकॉल बाहर फेंक अगर आप अभी भी त्रुटि है।

मेरे लिनक्स बॉक्स पर यह तब भी हुआ जब मेरे पास आईपी 4-इंटरफ़ेस सक्रिय था और मेरे एप्लिकेशन ने आईपी 4-इंटरफ़ेस को ip6 सेटिंग्स के साथ उपयोग करने का प्रयास किया। विंडोज़ के लिए भी वैध होना चाहिए।

यदि कुछ स्पष्ट नहीं है तो पूछें।

+0

मुझे पता है कि मैं आलसी गधा हूं लेकिन क्या आप मुझे बता सकते हैं कि इंटरफ़ेस में आईपी 6 प्रोटोकॉल को कैसे चालू करें? मैं एक लिनक्स बॉक्स का उपयोग कर रहा हूँ। – flyjohny

+0

पहले इस गाइड को http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x790 देखें।एचटीएमएल इसके बाद अपने विशिष्ट इंटरफ़ेस पर आज़माएं: ping6 -I eth0 "ip6addr यहां भरें" यह हो सकता है कि आपके लूपबैक इंटरफ़ेस में आईपी 6 समर्थन सक्रिय हो और इसलिए स्थानीय पिंग कोई समस्या नहीं है, क्या आप शायद हमें अपना लिनक्स डिस्ट्रो बता सकते हैं और कर्नेल संस्करण? –

6

आप आईपीवी 6 पिंग (यानी मैं eth0) के लिए इंटरफ़ेस निर्दिष्ट करना होगा:

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

एक IPv6 पिंग के लिए लिंक स्थानीय पतों का उपयोग करना, परिभाषित करने के लिए कौन-सा उपकरण इसे भेजने/पैकेट प्राप्त करना चाहिए की आवश्यकता है - प्रत्येक डिवाइस में एक लिंक-स्थानीय पता होता है।

इस के बिना कोशिश कर रहा है, त्रुटि संदेश में परिणाम होगा की तरह:

--> # 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 

एक समान दृष्टिकोण आप का पालन करना चाहिए:

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

इस मामले में आप अतिरिक्त इंटरफ़ेस निर्दिष्ट करने के लिए यहाँ दिखाया गया है की तरह है आपके ग्राहक एपीपी में ..

संबंधित मुद्दे