Portál AbcLinuxu, 12. května 2024 14:17


Dotaz: IPv6 client - connect() vrati Invalid argument

22.8.2010 08:30 rastos | skóre: 62 | blog: rastos
IPv6 client - connect() vrati Invalid argument
Přečteno: 298×
Odpovědět | Admin
Příloha:
V rámci prenikania do tajov IPv6 skúšam upraviť nejaký svoj program tak aby fungoval s IPv6 a nedarí sa mi úspešne vykonať volanie connect(). Nakoniec som sa rozhodol urobiť malý program, ktorý problém izoluje a skutočne mi to nefunguje.
./ipv6 joe 22
connect(): Invalid argument
22 je port, na ktorom počúva sshd a ssh klient sa na neho vie pripojiť. "joe" je meno, ktoré DNS správne resolvuje na moju IPv6 adresu:
host joe
joe.rastos.org has IPv6 address fe80::213:d3ff:fe60:f7ae
Odhadujem, že príčinou problému je to, že pre link-local adresu je potrebné špecifikovať interface (hoci mi nie je celom jasné prečo).

Otázka znie: skutočne je problém v tom, že nie je špecifikovaný interface? Ak áno, ako to programovo (a pokiaľ možno prenositeľne) spraviť? Ak sa robí v premennej sin6_scope_id štrukúty sockaddr_in6, tak v nej je nula - nie je to správne, ak tú adresu má eth0? Ak to nie je špecifikáciou interface-u, kde je problém?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.8.2010 21:15 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
Odpovědět | | Sbalit | Link | Blokovat | Admin
Příloha:
skutočne je problém v tom, že nie je špecifikovaný interface?

Vyzerá to tak, že áno.
Ak áno, ako to programovo (a pokiaľ možno prenositeľne) spraviť?

strcpy(ifr.ifr_name,"eth0");
err=ioctl(sockfd,SIOCGIFINDEX,&ifr);
((struct sockaddr_in6 *)(result->ai_addr))->sin6_scope_id=ifr.ifr_ifindex;

Zdá sa ale, že na Windowsoch to bude vyzerať inak.
v premennej sin6_scope_id štrukúty sockaddr_in6 je nula - nie je to správne, ak tú adresu má eth0?

Vyzerá to tak, že 0 nie je správne. Na mojom konkrétnom stroji ktorý má len jednu sieťovku to ioctl() povie index 2 a s tým sa ten demo program pripojí (btw, v prílohe v otázke chýbalo nastavenie portu).

Inšpiráciu som čerpal v zdrojákoch ping6.
31.8.2010 22:21 Nikola Pajkovský | skóre: 16
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
rtfm, man getaddrinfo, jsou tam priklady
Save the whales. Feed the hungry. Free the mallocs
2.9.2010 06:32 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
To máš asi iné man getaddrinfo ako ja.
5.9.2010 00:36 nikola12
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
ano toto
1.9.2010 15:22 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
Odpovědět | | Sbalit | Link | Blokovat | Admin
(hoci mi nie je celom jasné prečo)
Protoze obecne ta IP adresa je platna a unikatni jen v ramci jednoho iface/site. Sice obvykle je odvozena z unikatni MAC adresy, ale obecne to tak byt nemusi (muzes treba rucne nastavit linkovou adresu na fe80::1).

Jinak davat do DNS link-local adresu je IMHO padle na hlavu.
2.9.2010 06:49 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
Celkovo to vyzerá, že máš pravdu.
Protoze obecne ta IP adresa je platna a unikatni jen v ramci jednoho iface/site.
Kde konkrétne je to napísané? Mne by pripadalo logické, aby pri pokuse o priradenie tej istej link-local adresy ďalšiemu sieťovému rozhraniu systém povedal "sorry, tá už je použitá inde". Alebo prinajmenšom connect() by mohol byť taký chytrý, že ak tá link-local adresa existuje len na jednej sieťovej karte, tak to zožerie a chybu vyhlási len ak skutočne nie je možné rozhodnúť automatizovane.
Jinak davat do DNS link-local adresu je IMHO padle na hlavu.
To asi je. Vravel som, že objavujem ;-) Je tam totiž potom tiež problém, ako ten interface špecifikovať pri DNS mene pretože % je tuším povolený znak v DNS mene, takže nemožno použiť suffix "%eth0" ako pri IPv6 adrese.
4.9.2010 20:41 darth
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
Kde konkrétne je to napísané? Mne by pripadalo logické, aby pri pokuse o priradenie tej istej link-local adresy ďalšiemu sieťovému rozhraniu systém povedal "sorry, tá už je použitá inde". Alebo prinajmenšom connect() by mohol byť taký chytrý, že ak tá link-local adresa existuje len na jednej sieťovej karte, tak to zožerie a chybu vyhlási len ak skutočne nie je možné rozhodnúť automatizovane.
nuz ... povedal by som, ze je to napisane priamo v tom "nazve" (link-local) ;)
2.9.2010 22:29 Moje jmeno
Rozbalit Rozbalit vše Re: IPv6 client - connect() vrati Invalid argument
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mozna jsem to uplne nepochopil... Strilim od boku... Ale mam pocit, ze je to tim, ze se tam nikde nenastavi ten port.

V pripade IPv6 by mozna pomohlo pridat pred connect() neco jako:

((struct sockaddr_in6*)result->ai_addr)->sin6_port = htons(port);

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.