开发者

how to determine value for ipv6mr_interface field of ipv6_mreq structure

I am trying to create a BSD socket to listen for messages from a specific IPv6 multicast address. I currently have no problem creating the socket listening on the correct address 0::0.

The problem is that I am running on a small embedded linux server with multiple NICs; here the ipv6mr_interface field of the ipv6_mreq is important. By trial and error, I have determined th开发者_StackOverflow社区at 0, 1 and 3 do not work, but 2, does (it gives me all IPv6 multicast messages to my address, ff05::3, arriving on the correct interface).

My question is: How do I correlate, in linux, my interface, whos' address I know, to the correct interface number?


maybe you can have a look to the if_nametoindex(3) function (seen in /usr/include/net/in.h).

Sincerely, Rémi


To summarize my comments on the original answer:

  1. Stevens (UNIX Network Programming Vol. 1) gives a solution for mapping device name to interface number. This involves querying the OS routing table for the interface number over a raw socket. In the Second Edition this is in section 17.6 and in the Third Edition this is in section 18.6.
  2. You can also use the proc filesystem to gather the same information in option one. Of particular interest is the /proc/net/dev_mcast file. This file gives a mapping between interface name and interface number; mapping from IP address to interface name is presumably just as easy.

Presumably option 1 is the most robust since the proc filesystem can change how it's organized, what information is available and how it's formatted. I am not personally familiar with how often the Linux Kernel changes these attributes, so, someone with more information about this is welcome to comment or edit this post.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜