void master_service::find_addr_include(acl::string& name, acl::string& addr, const char* nic_names, const char* net_addrs) { ACL_IFCONF *ifconf; /* 网卡查询结果对象 */ ACL_IFADDR *ifaddr; /* 每个网卡信息对象 */ ACL_ITER iter; /* 遍历对象 */ /* 查询本机所有网卡信息 */ ifconf = acl_get_ifaddrs(); if (ifconf == NULL) { logger_error("acl_get_ifaddrs error: %s, use 127.0.0.1", acl::last_serror()); name = "lo"; addr = "127.0.0.1"; return; } acl::string nic_names_buf(nic_names); acl::string net_addrs_buf(net_addrs); const std::vector<acl::string>& names = nic_names_buf.split2(";, \t"); const std::vector<acl::string>& addrs = net_addrs_buf.split2(";, \t"); bool find_nic; /* 遍历所有网卡的信息, 从中找出匹配内网网卡地址的选项 */ acl_foreach(iter, ifconf) { ifaddr = (ACL_IFADDR*) iter.data; const char* ptr = ifaddr->name; if (ptr == NULL || *ptr == 0) { logger_error("ifaddr->name NULL"); continue; } // 找到网卡名匹配的地址 find_nic = false; for (std::vector<acl::string>::const_iterator cit = names.begin(); cit != names.end(); ++cit) { if ((*cit).ncompare(ptr, (*cit).size(), false) == 0) { find_nic = true; name = ptr; break; } } if (find_nic == false) continue; // 找到 IP 地址匹配的地址 for (std::vector<acl::string>::const_iterator cit = addrs.begin(); cit != addrs.end(); ++cit) { if (strstr(ifaddr->ip, (*cit).c_str()) != NULL) { addr = ifaddr->ip; break; } } if (!addr.empty()) break; }