黄家坤:
我看了下代码,有两个方面做的不好:
- 关于代码异常处理。在你修改的代码里面很多地方没有任何异常处理,比如函数GetMacFromDevice(),里面没有任何判断返回值,比如函数socket()和ioctl()的返回值代表了该函数是否正常运行,可你的代码里面直接使用,没有任何判断,这样使得代码健壮性很差,一旦出现问题就出现死掉或段错误之类让用户莫名其妙也不好调试的问题,所以最好对于所有这种情况都要有判断,本身这些函数都带有异常判断的,比如ioctl()函数返回值为0表示正常运行,而-1表示错误退出。网上这样的例子很多。
- 关于空间释放。诸如soket()函数用过后要用函数close()释放,这些你好像都没去做好。
上述代码问题虽然短时间好像没问题,但很有可能在后面的开发中出现严重问题。
举个简单例子:
http://stackoverflow.com/questions/3964494/having-a-problem-figuring-out-how-to-get-ethernet-interface-info-on-mac-os-x-usin
#if defined(HAVE_SIOCGIFHWADDR)
bool get_mac_address(char* mac_addr, const char* if_name = "eth0")
{
struct ifreq ifinfo;
strcpy(ifinfo.ifr_name, if_name);
int sd = socket(AF_INET, SOCK_DGRAM, 0);
int result = ioctl(sd, SIOCGIFHWADDR, &ifinfo);
close(sd);
if ((result == 0) && (ifinfo.ifr_hwaddr.sa_family == 1)) {
memcpy(mac_addr, ifinfo.ifr_hwaddr.sa_data, IFHWADDRLEN);
return true;
}
else {
return false;
}
}
#elif defined(HAVE_GETIFADDRS)
bool get_mac_address(char* mac_addr, const char* if_name = "en0")
{
ifaddrs* iflist;
bool found = false;
if (getifaddrs(&iflist) == 0) {
for (ifaddrs* cur = iflist; cur; cur = cur->ifa_next) {
if ((cur->ifa_addr->sa_family == AF_LINK) &&
(strcmp(cur->ifa_name, if_name) == 0) &&
cur->ifa_addr) {
sockaddr_dl* sdl = (sockaddr_dl*)cur->ifa_addr;
memcpy(mac_addr, LLADDR(sdl), sdl->sdl_alen);
found = true;
break;
}
}
freeifaddrs(iflist);
}
return found;
}
#else
# error no definition for get_mac_address() on this platform!
#endif
--
郑海永
+--------------------------------------------------+
| Haiyong Zheng
| Department of Electronic Engineering,
| College of Information Science and Engineering,
| Ocean University of China.
+--------------------------------------------------+