how to determine value for ipv6mr_interface field of ipv6_mreq structure

我的未来我决定 提交于 2020-01-16 19:39:38

问题


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 that 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?


回答1:


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

Sincerely, Rémi




回答2:


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.



来源:https://stackoverflow.com/questions/1609721/how-to-determine-value-for-ipv6mr-interface-field-of-ipv6-mreq-structure

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!