2011-01-03 19 views

Odpowiedz

3

Można powiązać gniazdo do określonego interfejsu za pomocą opcji SO_BINDTODEVICE gniazdo, jednak wymaga to uprawnień roota.

Alternatywnie, można ustawić opcję IP_PKTINFO i używać sendmsg do wysyłania, ustawienie in_pktinfo „s ipi_ifindex do indeksu interfejsu.

+0

Nie wiesz: czy jest to metoda krzyżowa? Na przykład. czy działałoby to w systemie Windows®? –

+1

@ Hi-Angel: Nie próbowałem go, ale najwyraźniej można użyć ['IPPROTO_IP'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586 (v = vs .85) .aspx) Opcja gniazda 'IP_UNICAST_IF' w systemie Windows. Ta opcja pobiera indeks interfejsu i powinna również działać na obecnych systemach Linux (została dodana w 2012 roku i jest obecna w Linuksie v3.4). – Hasturkun

+0

Hmm, interesujące ... Nie znalazłem wzmianki o tej opcji w dokumentach GNU/Linux, ale znalazłem [krótką notatkę] (http://kernelnewbies.org/Linux_3.4), że została dodana, aby pomóc projektowi WINE. Mam nadzieję, że projekt WINE zdaje sobie z tego sprawę: D –

7

Użyj powiązania. Nie można wysyłać pakietów UDP za pośrednictwem interfejsu, który nie ma adresu IP, ponieważ protokół UDP korzysta z protokołu internetowego, a protokół internetowy wymaga adresu IP.

+0

Chyba, że ​​wyślesz je jako surowe pakiety. – nategoose

+0

@nategoose To byłoby oszukiwanie. – Oswald

+1

Bind nie pomaga. Źródłowy adres IP pakietu UDP jest poprawny (tj. Jest to adres IP interfejsu, z którego próbuję wysłać), ale sam pakiet przechodzi z domyślnego interfejsu. – jackhab

Powiązane problemy