linux如何获取以太网信息,Linux_C以太网基本操作

/**

*以太网模块

*完成功能:获取及IP、子网掩码设置DHCP自动获取IP

* Author:Lzy

* Greate Date:2012.03.15

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//以太网相关结构体

typedefstruct

{

charLocalIp[16];//IP addr

charMask[16];//mask addr

charMac[18];//phy addr

}ET_ENET_CONFIG;

typedefstruct

{

charDestination[16];//dest net

charMask[16];//dest mask addr

charGateWay[16];// gateway addr

}ET_ROUTE_CONFIG;//

set route struct

#defineMAXINTERFACES 16

#defineSIN_ADDR(x) (((structsockaddr_in *)

(&(x)))->sin_addr.s_addr)//套接字的IP地址

#defineSET_SA_FAMILY(addr, family) \

memset((char*)&(addr),'\0',sizeof(addr)); \

addr.sa_family = (family)//套接字协议栈地址

chardevice_name[20];

ET_ENET_CONFIGeth;

ET_ROUTE_CONFIGroute;

/**

*根据设备名获取IP和子网掩码

*/

intget_ip(char* ipaddr,char*netmask,constchar*ethname)

{

intret = -1;

if(ipaddr && netmask

&& ethname)

{

intfd, intrface;

structifreq buf[16];//声明一个structifreq结构体(这个结构体中有很多重要的参数)

structifconf ifc;//通常是用来保存所有接口信息的

if((fd = socket(AF_INET, SOCK_DGRAM,

0)) < 0)//建立一个套接字

return-1;

ifc.ifc_len=sizeof(buf);

ifc.ifc_buf= (caddr_t) buf;

if(ioctl(fd, SIOCGIFCONF, (char*) &ifc) < 0)//这里涉及ioctl函数对于网络文件的控制获取所有接口的清单

goto_error_;

intrface = ifc.ifc_len/sizeof(structifreq);

while(intrface-- > 0)

{

if(strstr(buf[intrface].ifr_name, ethname))

{

if((ioctl(fd, SIOCGIFADDR, (char*) &buf[intrface])) < 0)//获取接口地址

goto_error_;

sprintf(ipaddr,"%s", inet_ntoa(((structsockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr));//将一个in_addr结构体输出成点数格输出IP地址

if((ioctl(fd, SIOCGIFNETMASK,

(char*)

&buf[intrface])) < 0)

`//获取子网掩码

goto_error_;

sprintf(netmask,"%s", inet_ntoa(((structsockaddr_in*) (&buf[intrface].ifr_netmask))->sin_addr));

ret = 0;

}

}

_error_: close(fd);

}

returnret;

}

/**

*获取物理地址

*/

intget_mac(char*mac)

{

intfd, ret = -1;

if(mac)

{

structifreq ifr;

if((fd = socket(AF_INET, SOCK_DGRAM,

0)) < 0)//建立套接字

{

printf("socket");

return-1;

}

ifr.ifr_addr.sa_family = AF_INET;//指定套接字协议栈地址

strncpy(ifr.ifr_name,"eth0", IFNAMSIZ - 1);//把网卡名字复制到ifreq结构体中的name变量

if(ioctl(fd, SIOCGIFHWADDR,

&ifr) == 0)//获取物理地址

{

sprintf(mac,"%02x-%02x-%02x-%02x-%02x-%02x", (unsignedchar) ifr.ifr_hwaddr.sa_data[0], (unsignedchar) ifr.ifr_hwaddr.sa_data[1], (unsignedchar) ifr.ifr_hwaddr.sa_data[2], (unsignedchar) ifr.ifr_hwaddr.sa_data[3], (unsignedchar) ifr.ifr_hwaddr.sa_data[4], (unsignedchar) ifr.ifr_hwaddr.sa_data[5]);

//  strupr(mac);

ret = 0;

}

close(fd);

}

returnret;

}

/**

*设置IP地址

*/

staticintset_ipaddr(char*ipaddr)

{

charipaddress[60];

sprintf(ipaddress,"ifconfig eth0

%s",

ipaddr);

printf("%s\n", ipaddress);

system(ipaddress);

return0;

}

/**

*设置子网掩码

*/

staticintset_netmask(char*netmask)

{

charnetset[60];

sprintf(netset,"ifconfig eth0 netmask

%s",

netmask);

printf("%s\n", netset);

system(netset);

return0;

}

/**

*设置网关

*/

staticintset_gateway(char*gateway)

{

charnetset[60];

sprintf(netset,"ifconfig eth0

broadcast %s", gateway);

printf("%s\n", netset);

system(netset);

return0;

}

/**

*函数功能:设置或读取以太网各参数

*命令ID定义说明:

* ulCmdId           argp

*

0x01       -->输出参数,指向ET_ENET_CONFIG结构体的指针,读取当前的以太网信息(主要获取本机IP地址、掩码地址及物理地址)

*

0x02-->输入参数,指向ET_ENET_CONFIG结构体的指针,设置以太网本地IP,掩码地址

*

0x06-->输入参数,指向ET_ROUTE_CONFIG结构体的指针,设置路由

*

0x08-->参数无,以太网复位操作

*返回值: 0x8B-->参数错误: 0x00-->执行成功: 0x01-->执行失败

*/

intST_NetExpand(unsignedlongulCmdId,char*argp)

{

printf("get ip\n");

charcmd[256];

memset(cmd, 0,sizeof(cmd));

switch(ulCmdId)

{

case0x01:

{

get_ip(eth.LocalIp, eth.Mask,"eth0");

get_mac(eth.Mac);

memcpy(argp, &eth,sizeof(eth));

break;

}

case0x02:

{

memcpy(&eth, argp,sizeof(ET_ENET_CONFIG));

set_ipaddr(eth.LocalIp);

set_netmask(eth.Mask);

break;

}

case0x06:

{

memcpy(&route,

argp,sizeof(ET_ENET_CONFIG));

sprintf(cmd,"route add -net %s netmask

%s gw %s", route.Destination, route.Mask,

route.GateWay);

system(cmd);

break;

}

case0x08:

return0x00;

}

return0x00;

}

/**

*函数功能:设置或读取以太网各参数

*命令ID定义说明:

* ulCmdId           argp

* 0x00--------- |0x00-->0表示关闭DHCP功能

*                               |0x01-->设置"开机后自动启动DHCP来获取IP地址

* 0x01-->输出参数,用以存储状态值(要求为int型指针变量,作为输出参数)

*用在开启DHCP功能后,获取DHCP的工作状态(见下表中状态值定义)

*

------------------------------------------------------------------------------------------------------

*

DHCP的工作状态表

*

:0x01-->正准备启动

*

:0x02-->DHCP已启动

*

:0x03-->成功获取IP地址

*

:0x04-->获取IP地址失败

*返回值:0x8B-->参数错误:0x00-->执行成功:0x01-->执行失败

*/

voiddhcp_start(void)

{

system("udhcpc");//自动获取IP

}

pthread_tid_dhcp;

intST_NetDhcpExpand(unsignedlongulCmdId,char*argp)

{

if(ulCmdId == 0x01)

{

pthread_create(&id_dhcp,

NULL, (void*) dhcp_start, NULL);

}

if(ulCmdId == 0)

{

pthread_cancel(id_dhcp);

}

*argp = 0;

;

return0x00;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值