2019独角兽企业重金招聘Python工程师标准>>>
<!-- lang: cpp -->
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <arpa/inet.h>
/* Sample: 取本机所有网口的ip地址 */
int main(int argc, char** argv)
{
int ret = 0;
int fd = -1;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if ( fd < 0 ) {
printf("%s@%d: error, errno = %d\n", __FILE__, __LINE__, errno);
ret = -1;
goto out;
}
// 要小心,这里是最大取32个网口,如果有超过32个网口;下面ioctl会踩内存的。
struct ifconf ifc;
struct ifreq buf[32];
memset(buf, 0, sizeof(buf));
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t)buf;
ret = ioctl(fd, SIOCGIFCONF, (char*)&ifc);
if ( ret < 0 ) {
printf("%s@%d: error, errno = %d\n", __FILE__, __LINE__, errno);
goto out;
}
int ifcnt = ifc.ifc_len / sizeof(struct ifreq);
while ( ifcnt-- > 0 ) {
ret = ioctl(fd, SIOCGIFADDR, (char*)&buf[ifcnt]);
if ( ret < 0 ) {
printf("%s@%d: error, errno = %d\n", __FILE__, __LINE__, errno);
goto out;
}
printf("%s: %s\n", buf[ifcnt].ifr_name,
inet_ntoa(((struct sockaddr_in*)(&buf[ifcnt].ifr_addr))->sin_addr));
}
out:
if ( fd >= 0 )
close(fd);
return ret;
}