在用到ACE_SOCK_Dgram_Mcast时如果要绑定网卡设备,而需要在join时提供设备名称,而我的程序设计是设置IP的,所以需要通过IP得到设备名。后来多方查询资料,做了如下函数:
string get_bind_nic(string ipaddr)
{
ACE_SOCK_Dgram so(ACE_INET_Addr((u_short)0));
ifreq if_buf[16];
ifconf ifc;
int nic_count;
ifc.ifc_len = sizeof(if_buf);
ifc.ifc_buf = (caddr_t)if_buf;
if(ACE_OS::ioctl(so.get_handle(), SIOCGIFCONF, (char*)&ifc) == 0)
{
nic_count = ifc.ifc_len / sizeof(struct ifreq);
while(nic_count-- > 0)
{
if(ACE_OS::ioctl(so.get_handle(), SIOCGIFADDR, (char*)&if_buf[nic_count]) == 0)
{
if(ipaddr == ACE_OS::inet_ntoa(((struct sockaddr_in*)(&if_buf[nic_count].ifr_addr))->sin_addr))
return if_buf[nic_count].ifr_name;
}
}
}
return "";
}
需要注意的是,这个函数只支持第一个匹配的设备名的……