当前位置:首页 » 操作系统 » linux中ifa

linux中ifa

发布时间: 2022-05-06 12:53:33

python 并列条件判断怎么写例如 ifa>b amp;amp;c

$python
Python2.7.3(default,Mar142014,11:57:14)
[GCC4.7.2]onlinux2
Type"help","right","credits"or"license"formoreinformation.
>>>a=1
>>>b=2
>>>c=2
>>>d=4
>>>ifa<b==c<d:
...print"OK"
...
OK
>>>

⑵ linux编程获取本机的所有网口名称

struct ifaddrs
{
struct ifaddrs *ifa_next; /* Next item in list */
char *ifa_name; /* Name of interface */
unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */
struct sockaddr *ifa_addr; /* Address of interface */
struct sockaddr *ifa_netmask; /* Netmask of interface */
union
{
struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */
struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */
} ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void *ifa_data; /* Address-specific data */
};

⑶ 初学编程,请指教:我想知道这个程序是如何运行的

我以 linux 系统为例,简单讲讲程序由编译链接装载与执行。elf 文件格式分为很多段—section,总体分为只读可执行的代码段与可读可写的数据段。.txt 就是典型的代码段,.data .rodata .symbl .rel .got .plt 都是数据段。那么,编译器负责将程序员写的程序,编译成 elf 文件,代码,注视,代码行对应机器码信息,就是调试信息啦会进去 .txt .code .comment .debug 段,常量与静态变量进入 .data .rodata .bss。接下来,编译器将引用的头文件中的代码(特指静态编译)与引用的 glibc 中的库函数打包(链接)到整个可执行文件中,然后在 elf 文件中设置文件头信息,如段表位置,程序入口位置等信息。当然,这里不得不提的是符号表,与重定位表,他们是整个程序最终能跑起来的关键。

⑷ 一台linux可支持多少tcp链接

这个文件是一个综合性的问题。首先就tcp链接来说吧,主要体现在tcp的socket链接数上面,65535 应该是足够用了,但是tcp连接11种状态,不同不同状态有可能有会话保持什么的。这些暂且不说,现在tcp连接的还有Linux下文件的最大打开数量,流量带宽等等。
优化:
1.ulimit -a 查看最大文件打开数量,然后修改
2.减少tcp长连接,或其他状态链接,可以改下会话保持时间,主动自动关闭(不建议),重复使用tcp等。这个是在tcp链接数来进行考虑。
3.增多IP,增多端口,一个IP是这么多,那可以在一台Linux上绑定多个IP来增加链接数。等等
运维是一个大的课题,大家都是在学习中提高的,我的答案不一定正确,大家可以相互指正。更多Linux可以参考《Linux就该这样学》,加油

c语言如何获取嵌入式linux网卡上的mac地址

全对应的

getmacaddress.c

#include<stdio.h>

#ifdefined(WIN32)||(!defined(__GNUC__)&&!defined(__clang__))
#include<winsock2.h>
#include<iphlpapi.h>
#include<stdlib.h>
#pragmacomment(lib,"IPHLPAPI.lib")
#elifdefined(__linux__)
#include<string.h>//strncpy
#include<sys/ioctl.h>
#include<sys/socket.h>
#include<net/if.h>
#else
//bsd
#include<sys/types.h>//FreeBSDu_int
#include<ifaddrs.h>
#include<net/if.h>
#include<net/if_dl.h>
#include<net/if_types.h>
#endif

voidgetmacaddress(char*mac_address){
#ifdefined(WIN32)||(!defined(__GNUC__)&&!defined(__clang__))

PIP_ADAPTER_INFOpAdapterInfo;
PIP_ADAPTER_INFOpAdapter;
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
unsignedchar*addr;

mac_address[0]=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
if(!pAdapterInfo)return;
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==ERROR_BUFFER_OVERFLOW){
free(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);
if(!pAdapterInfo)return;
}

if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==NO_ERROR){
pAdapter=pAdapterInfo;
if(pAdapter){
addr=pAdapter->Address;
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
}
free(pAdapterInfo);
#elifdefined(__linux__)

mac_address[0]=0;
structifreq*ifr,*ifend;
structifreqifreq;
structifconfifc;
structifreqifs[16];
intfd;
unsignedchar*addr;

fd=socket(AF_INET,SOCK_DGRAM,0);
ifc.ifc_len=sizeof(ifs);
ifc.ifc_req=ifs;
if(ioctl(fd,SIOCGIFCONF,&ifc)<0){close(fd);return;}

ifend=ifs+(ifc.ifc_len/sizeof(structifreq));
for(ifr=ifc.ifc_req;ifr<ifend;ifr++){
if(ifr->ifr_addr.sa_family==AF_INET){
strncpy(ifreq.ifr_name,ifr->ifr_name,sizeof(ifreq.ifr_name));
if(ioctl(fd,SIOCGIFHWADDR,&ifreq)<0)continue;
addr=ifreq.ifr_hwaddr.sa_data;
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
}
close(fd);
#else
//bsd
mac_address[0]=0;
structifaddrs*ifa_list,*ifa;
structsockaddr_dl*dl;
unsignedchar*addr;
if(getifaddrs(&ifa_list)<0)return;
for(ifa=ifa_list;ifa;ifa=ifa->ifa_next){
dl=(structsockaddr_dl*)ifa->ifa_addr;
if(dl->sdl_family==AF_LINK&&dl->sdl_type==IFT_ETHER){
addr=(unsignedchar*)LLADDR(dl);
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
return;
}
}
freeifaddrs(ifa_list);
#endif
}

⑹ 这个批处理文件是干什么用的

将你的物理地址绑定ip地址,可以防止arp攻击。

arp 命令
处理系统的 ARP 缓存,可以清除缓存中的地址映射,建立新的地址映射;

语法:arp [-v][-n][-H type][-i if] -a [hostname]
arp [-v][-i if] -d hostname [pub]
arp [-v][-H type][-i if] -s hostname hw_addr [temp]
arp [-v][-H type][-i if] -s hostname hw_addr [netmask nm] pub
arp [-v][-H type][-i if] -Ds hostname ifa [netmask nm] pub
arp [-v][-n][-D][-H type][-i if] -f [filename]

该命令的各选项含义如下:

-v 显示详细信息;
-n 以数字地址形式显示;
-i If选择界面;
-H type设置和查询arp缓存时检查 type 类型的地址;
-a [hostname] 显示指定 hostname 的所有入口;
-d hostname 删除指定 hostname 的所有入口;
-D 使用ifa硬件地址界面;
-s hostname hw_addr 手工加入 hostname 的地址映射;
-f filename 从指定文件中读入 hostname 和硬件地址信息。

⑺ 在Linux中 if [ $ !=0 ] then 的含义

ifthen间的是逻辑表达式,不是赋值表达式。c语言:if(a(i,j)==0)vb6:ifa(i,j)=0thenIfA(i,j)=0ThenA(i,j)=k这句的意思是如果A(i,j)=0,那么给A(i,j)赋值K

⑻ 从ip addr add和ifconfig的区别看linux网卡ip地址的结构

如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上,每一个网卡设备都有一个mac地址,但是却可 以有多个网络层地址,比如IP地址,然而这个事实无法很好地像用户提供操作接口,所以就引出了ip别名(IP aliases)和辅助ip(secondary IP addresses)的概念。其实很容易理解这个事实,按照分层的思想,下层总是为上层服务,也就是为上层提供舞台,上层利用下层的服务,而不必让下层知 道自己的情况,如果一个拥有合理mac地址的网卡没有配置网络层地址(比如IP地址)这件事合理的话,那么为这个设备配置多个IP地址也是合理的,正好像 一个ip可以对应多个应用层端口一样,也就是说,下层对上层总是一对多的关系,在分层架构中这种关系是合理的。下面我们就看一下linux的网卡的ip地 址结构。刚才说了在linux中,一个网卡可以有多个IP,那么这多个ip有什么关系呢?其实这些ip组成了一个吊链结构,所谓吊链结构就是一些节点链接 成一条链,然后每个节点带有自己的一条链


每个节点代表的ip地址标识一个网段,这个节点的ip就是这个网段的 Primary地址,它下面所带的ip就是这个网段的Secondary地址,也就是说一个网卡可以带有各个节点所带链表长度之和个ip地址,而且这些 ip不是线形的,而是上述的吊链结构。我们看一下这么做有什么好处。玩过Cisco路由器的朋友可能都知道有个Secondary IP的概念,这个特性可以创建逻辑子网,也就是说在一个物理网口上连接两个子网,这咋看起来好像不可思议,其实很简单,比如这个网口接到一台交换机上,如 果这个网口没有配置Secondary IP的话,那么这台交换机只能连接一个网段的主机,比如192.168.1.1/24,但是,如果它配置了Secondary IP,那么就可以连接两个网段的主机,比如192.168.1.1/24和10.0.0.1/24,道理就是这么简单,但是却很有用,该机制可以被路由汇 总策略所使用。注意上面这个例子中的Secondary IP不是这里说的linux的Secondary address,在linux中恰恰相反,只要一个网卡上配置的ip不是一个网段的,那么都是Primary IP,就是吊链结构中上面的那条主链中的IP,linux中的Secondary address是主链结点的子链结点中的IP,这一点一定注意,概念是不能混淆的。前面说的只是吊链中主链的作用,那么子链呢?其实想象一下也很简单,比 如一台机器上运行着一个代理服务器或者负载均衡服务,代理服务器或者负载均衡服务和主服务器要监听相同的端口,那么就可以用secondary address来解决了,只要需要在同一网段监听同一个端口的应用都是吊链中子链存在的原因,因此可以说,主链对外部或者说对下面链路层虚拟了多块网卡, 而子链向上层虚拟了多台机器,配置了吊链结构的linux主机如果说只有一块网卡,那么外部会认为它有多块网卡,对于内部,应用层会认为彼此在不同的主机 上,这就是效果。
除了上面大体的介绍之外,还有很多细节,吊链在主链上是没有主次的,子链除了第一个节点其它节点也不分主次,都是平行的关系,但是子链中的第一个节点总是 链接在主链中,它们携带的地址就是primary地址,它们下面隶属的子链携带的地址就是这个primary地址的secondary地址,如此看来,一 旦主链上一个节点被删除了,那么它的子链也将不复存在,所谓皮之不存毛将焉附。但是这种策略总是显得不是那么优美,因为父亲犯错,儿子也要受连累,这在现 代社会早就不时行了,那么就需要改变机制了,因此linux中特意有了一个选项,就是当一个primary地址被删除时,如果它有secondary地址 的话,那么它的第一个secondary地址(长子)继承被删除的primary地址的位置成为primary地址,这样就显得很合理了,要不然在删除 primary地址的时候,如果有程序用secondary地址,那么要么延迟删除,要么程序崩溃,采用自动提升策略的话就不会出现问题。
至于说IP aliases,那是以前版本有的了,就是一个实现问题,解决的问题和现在的secondary IP机制一样,它主要就是在物理网卡名字后面加上后缀从而成为虚拟网络接口,本质上和secondary IP机制没有区别,区别就是IP aliases显得不是那么直观,而secondary IP却是真正让应用看到了一个网卡的多个地址,比如你要是用IP aliases的话,有的时候你总是会问eth0:0是什么?我就曾经在内核里面拼命找eth0:0这个网络设备的注册代码,都要疯掉了也没有找到,其实 我并不是很傻,但是我却因为那个该死的名字作出了傻事。
下面就可以看看linux内核的实现代码了,首先弄明白一些数据结构,最重要的就是net_device,其次就是in_device,然后就是in_ifaddr,明白了这三个数据结构,一切就明白了,这是真的。

structnet_device
{
...
void*ip_ptr;//指向一个in_device结构,这字段从net_device中分离表明一个网卡可以支持多种网络层协议的
...
}
structin_device
{
structnet_device*dev;//指向它隶属的net_device,也就是网卡
atomic_trefcnt;//引用计数
intdead;
structin_ifaddr*ifa_list;//所有的ip地址链表
...
};
structin_ifaddr//代表一个ip地址
{
structin_ifaddr*ifa_next;//上面的in_device中的ifa_list字段就是靠这个字段连成链的
structin_device*ifa_dev;//回指in_device结构
structrcu_headrcu_head;
u32ifa_local;//ip地址
u32ifa_address;
u32ifa_mask;//掩码
u32ifa_broadcast;//广播地址
u32ifa_anycast;
unsignedcharifa_scope;
unsignedcharifa_flags;//只有IFA_F_SECONDARY标志,因为除了这个就是primary地址了
unsignedcharifa_prefixlen;
charifa_label[IFNAMSIZ];//名字,在ipaliases时代,它就可能是ethx:y的形式,在secondaryip时代,它统一就是ethx
};


注 意,上面的结构并没有将linux网卡的ip地址结构表示为吊链结构,所谓的吊链结构只是逻辑上的,在数据结构上,一个网卡所有的ip地址全部都在 ifa_list中被链接成一个线性的链表,至于是primary地址还是secondary地址就看in_ifaddr的ifa_flags字段了。每 当有新的地址被设置的时候,inet_insert_ifa总是被调用,linux为何没有在代码上将ip地址表示为吊链结构呢?我也不知道,个人感觉一 个net_device带有一个primary ip链表,然后每个primary ip节点带有一个secondary ip链表,这样会更好一些的,我觉得inet_insert_ifa实现的十分拙劣。添加地址可以通过两个用户空间程序搞定,一个是ifconfig,另 一个是ip addr add,ifconfig是基于ioctl进行地址添加的,而ip程序是基于netlink进行地址添加的,不管哪一种方式都可以达到目的,现在就可以看 看另一个问题了:为何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig设置的地址ip addr show却是可以看到。这个问题通过看代码一眼就可以明白,在ifconfig获得ip地址的时候,代码:

for(ifap=&in_dev->ifa_list;(ifa=*ifap)!=NULL;ifap=&ifa->ifa_next)
{
if(!strcmp(ifr.ifr_name,ifa->ifa_label)&&sin_orig.sin_addr.s_addr==ifa->ifa_address)
{
break;
}
}


取 的是这个被找到的ifa的ip地址,而我们知道,所有的ifa链接成一个线性链表,那么找到了第一个就不会再往后走了,因此只能得到一个结果,就是链表最 前面的那个,而ip add show就不同了,具体在函数inet_mp_ifaddr中实现,该函数遍历所有的ifa,并且传到用户空间缓冲区。这里可以做一个实验:首先用 ip addr add添加几个不在同一个网段的primary ip地址,然后再ifconfig一个和前面的ip都不在一个网段的ip,然后可以用ifconfig查看一下,发现不是刚刚用ifconfig设置进去 的那个ip,而是用ip addr add添加进去的,这就说明ifconfig永远都是取的ifa链表最前面的那一个,还有一点要注意,就是如果你用ip addr add添加了很多的secondary ip地址,那么恰好你用ifconfig设置的ip地址和那些secondary ip在一个网段,那么所有的secondary ip都将被删除,这些都是sencondary ip的规范决定的,而且在代码中也有体现。另外还要注意,路由表的表项都是基于primary ip的,因为所有的操作都是以primary ip为主的,比如在添加路由的时候:

voidfib_add_ifaddr(structin_ifaddr*ifa)
{
structin_device*in_dev=ifa->ifa_dev;
structnet_device*dev=in_dev->dev;
structin_ifaddr*prim=ifa;
...
if(ifa->ifa_flags&IFA_F_SECONDARY){//如果ifa是个sencondary地址,那么就找到它隶属的primary地址后然后以这个primary为主进行设置
prim=inet_ifa_byprefix(in_dev,prefix,mask);
if(prim==NULL){
printk(KERN_DEBUG"fib_add_ifaddr:bug:prim==NULL/n");
return;
}
}
fib_magic(RTM_NEWROUTE,RTN_LOCAL,addr,32,prim);//添加进路由表
...
}


到 此为止我们知道了不少东西,最重要的就是linux中网卡ip地址的吊链结构以及这么设计的好处,另外就是设置ip地址的方式有ioctl和 netlink。其实网卡拥有多个ip并不会带来什么冲突,本质上ip和网卡没有什么关系,它们唯一的关系就是靠网络分层模型联系在一起的,细节上就是靠 路由联系在一起的,比如我添加路由的时候指定了一个目的地址和下一跳ip地址以及一个网卡出口,那么内核会根据提供的目的地址将路由插在合式的位置,然后 将nh的网络设备设置为你提供的网卡出口,等到传输数据的时候就会查找路由从而找到出口,就是这么简单,你自己手动设置的路由可以随意设置,即使完全错误 内核也会将之加入路由表的,还有一种路由是内核自动生成的,就是在网卡刚刚up的时候,这时通过网卡的net_device找到其in_device然后 找到其ip地址,这样的路由称为链路路由。
通过secondary IP机制,你可以认为你的机器有很多网卡,对于应用,监听同一端口的应用会认为它们在局域网中不同的机器上,你可以随意使用这些ip地址而不会发生混乱,路由和底层的arp会处理好这一切,当然前提是你将路由设置对。
附: 用户空间有ifup/ifdown,/sbin/ip,ifconfig,还有netplugd守护进程,这些有何关系吗?这中间ip程序是最基本的,没 有任何策略,策略就是参数指定,要么就是别的程序调用它,而netplugd就是一个监控守护进程,通过netlink监控网卡状态,然后根据不同的监控 结果调用/etc/netplug.d/netplug脚本,进而可能调用ifup/ifdown脚本,而后者就是脚本,其中会调用ifup-eth脚 本,最终整理好参数后调用ip程序(典型的就是:ip link set eth0 up/down),当然ip程序完全可以自己调用,比如ip addr add以及ip route add等等,而ifconfig没有那么绕圈子,就是通过ioctl进行设置,可以通过strace来观察。这其中奥妙大了去了,说白了就是策略和机制分 离,另外还体现出linux中的很多功能都是很小的程序组合而成的。

Linux的ip地址的吊链结构以及ip地址的寻址特性(详见《关于IP网段间互访的问题—路由是根本》)充分说明了linux的协议栈实现多么的完美,完全符合分层和封装模型,使得下层的逻辑和上层的逻辑完全解除耦合,也就是说ip层完全不依赖链路层以及物理层的物理布局,最后记住,ip层事情比如寻址路由只由ip层实现,之所有有链路层发现的路由,完全是为了方便。

热点内容
问道刷道队伍怎么配置 发布:2024-10-07 12:09:17 浏览:321
androidservice使用 发布:2024-10-07 12:00:01 浏览:261
乐视2安卓版本怎么升级 发布:2024-10-07 11:51:11 浏览:696
方舟电脑版怎么进入官方服务器 发布:2024-10-07 11:09:32 浏览:805
百度云快速上传 发布:2024-10-07 10:52:25 浏览:480
java岛屿 发布:2024-10-07 10:29:25 浏览:971
qq会员的密码是多少 发布:2024-10-07 10:26:03 浏览:761
访问源服务器ip 发布:2024-10-07 10:24:31 浏览:57
脚本整理 发布:2024-10-07 10:20:48 浏览:236
图片上传功能java 发布:2024-10-07 10:14:18 浏览:131