69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
#define NIPQUAD_FMT "%u.%u.%u.%u"
uint32_t obtain_ip(const char *dev)
{
int fd = -1;
struct ifreq ifr;
struct sockaddr_in *addr;
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
{
perror("socket()");
return 0;
}
if (ioctl(fd, SIOCGIFADDR, &ifr))
{
perror("ioctl()");
close(fd);
return 0;
}
close(fd);
addr = (struct sockaddr_in *)&(ifr.ifr_addr);
return addr->sin_addr.s_addr;
}
int main(int argc, char **argv)
{
uint32_t ip = obtain_ip(argv[1]);
if (ip)
printf("ip: %u.%u.%u.%u\n", NIPQUAD(ip));
return 0;
}
或指定接口MAC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <assert.h>
int obtain_mac(const char *ifname, unsigned char *mac, int len)
{
int sk = -1, ret = 0;
struct ifreq ifreq;
assert(ifname);
assert(mac);
assert(len >= 6);
sk = socket(AF_INET, SOCK_STREAM, 0);
if (sk < 0)
{
perror("socket");
ret--;
goto OUT;
}
strcpy(ifreq.ifr_name, ifname);
if (ioctl(sk, SIOCGIFHWADDR, &ifreq) < 0)
{
perror("ioctl");
ret--;
goto OUT;
}
memcpy(mac, (unsigned char *)ifreq.ifr_hwaddr.sa_data, 6);
OUT:
if (sk >= 0)
close(sk);
return ret;
}
int main(int argc, char **argv)
{
unsigned char mac[12];
if (obtain_mac(argv[1], mac, sizeof(mac)) < 0)
return -1;
printf("%02X:%02X:%02X:%02X:%02X:%02X\n",
mac[0],
mac[1],
mac[2],
mac[3],
mac[4],
mac[5]
);
return 0;
}