#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<errno.h>
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<net/if.h>
#include
<netdb.h>
#include
<syslog.h>
#include
<linux/sockios.h>
#include
<net/if_arp.h>

int get_local_ip(char *localip) //获取本地 eth0 的地址
{
int err = -1;
int s;

s
= socket(AF_INET,SOCK_DGRAM,0); //创建套接字
if(s < 0) {
printf(
"socket create error\n");
return -1;
}

struct ifreq ifr; //方便操作设置指向sockaddr_in的指针
struct sockaddr_in *sin = (struct sockaddr_in *)&(ifr.ifr_addr);
memset(localip,
0,16);
memcpy(ifr.ifr_name,
"eth0",5); //查询 eth0

err
= ioctl(s,SIOCGIFADDR,&ifr);
if(!err) {
inet_ntop(AF_INET,
&sin->sin_addr.s_addr,localip,16); //整型转换成点分四段的字符串
syslog(LOG_USER|LOG_INFO,"process %d get localip:%s\n",getpid(),localip);
}
close(s);
return 0;
}

int get_local_mac(unsigned char *localmac)
{
int err = -1;
int s;

s
= socket(AF_INET,SOCK_DGRAM,0); //创建套接字
if(s < 0) {
printf(
"socket create error\n");
return -1;
}

struct ifreq ifr;
memcpy(ifr.ifr_name,
"eth0",5); //查询 eth0
err = ioctl(s,SIOCGIFHWADDR,&ifr);

if(!err) {
memcpy(localmac,ifr.ifr_hwaddr.sa_data,
6);
syslog(LOG_USER
|LOG_INFO,"process %d get localmac:%02x-%02x-%02x-%02x-%02x-%02x\n",
getpid(),localmac[
0],localmac[1],localmac[2],localmac[3],localmac[4],localmac[5]);
}
close(s);
return 0;
}

int set_local_ip(char *ip)
{
int err = -1;
int s;

s
= socket(AF_INET,SOCK_DGRAM,0); //创建套接字
if(s < 0) {
printf(
"socket create error\n");
return -1;
}

struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *)&(ifr.ifr_addr);

memset(
&ifr,0,sizeof(ifr));
memcpy(ifr.ifr_name,
"eth0",5); //设置 eth0 的地址
inet_pton(AF_INET,ip,&(sin->sin_addr.s_addr)); //转换成网络字节序

sin
->sin_family = AF_INET; //协议
err = ioctl(s,SIOCSIFADDR,&ifr);
if(err) {
syslog(LOG_USER
|LOG_INFO,"process %d set ip error\n",getpid());
printf(
"%s\n",strerror(errno));
}
else
syslog(LOG_USER
|LOG_INFO,"process %d set ip %s\n",getpid(),ip);

close(s);
return 0;
}

int get_host_mac(char *ip)
{
int s;
struct arpreq arp;
struct sockaddr_in *addr = (struct sockaddr_in *)&arp.arp_pa;
unsigned
char mac[6];
int err = -1;

s
= socket(AF_INET,SOCK_DGRAM,0); //创建套接字
if(s < 0) {
printf(
"socket create error\n");
return -1;
}

addr
->sin_family = AF_INET; //填充arp成员arp_pa
addr->sin_addr.s_addr = inet_addr(ip);
if(addr->sin_addr.s_addr == INADDR_NONE) {
syslog(LOG_USER
|LOG_INFO,"pid = %d: ip %s ,error format\n",getpid(),ip);
return -1;
}

strcpy(arp.arp_dev,
"eth0"); //查询 eth0 的 mac 地址
err = ioctl(s,SIOCGARP,&arp);
if(err < 0) {
syslog(LOG_USER
|LOG_INFO,"pid = %d: ioctl error\n",getpid());
return -1;
}
else {
memcpy(mac,(unsigned
char *)&arp.arp_ha.sa_data,6);
syslog(LOG_USER
|LOG_INFO,"process %d get %s mac:%02x-%02x-%02x-%02x-%02x-%02x\n",
getpid(),ip,mac[
0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
close(s);
return 0;
}

int main()
{
// char localip[16];
// unsigned char localmac[6];
// get_local_ip(localip);
// printf("localip = %s\n",localip);
// get_local_mac(localmac);
// printf("process %d get localmac:%02x-%02x-%02x-%02x-%02x-%02x\n",
// getpid(),localmac[0],localmac[1],localmac[2],localmac[3],localmac[4],localmac[5]);
// set_local_ip("192.168.1.155");
// get_host_mac("192.168.1.1");
return 0;
}

 posted on 2011-03-17 17:12  如是晴朗  阅读(408)  评论(0编辑  收藏  举报