Portál AbcLinuxu, 13. května 2025 03:10
./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?
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.
(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.
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
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) ;)
((struct sockaddr_in6*)result->ai_addr)->sin6_port = htons(port);
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.