#define _GNU_SOURCE     /* To get defns of NI_MAXSERV and NI_MAXHOST */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/if_link.h>
int main(int argc, char *argv[])
    struct ifaddrs *ifaddr, *ifa;
    int family, s, n;
    char host[NI_MAXHOST];
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    /* Walk through linked list, maintaining head pointer so we
       can free list later */
    for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
        if (ifa->ifa_addr == NULL)
            continue;
        family = ifa->ifa_addr->sa_family;
        /* Display interface name and family (including symbolic
           form of the latter for the common families) */
        printf("%-8s %s (%d)\n",
                ifa->ifa_name,
                (family == AF_PACKET) ? "AF_PACKET" :
                (family == AF_INET) ? "AF_INET" :
                (family == AF_INET6) ? "AF_INET6" : "???",
                family);
        /* For an AF_INET* interface address, display the address */
        if (family == AF_INET || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                    (family == AF_INET) ? sizeof(struct sockaddr_in) :
                    sizeof(struct sockaddr_in6),
                    host, NI_MAXHOST,
                    NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s\n", gai_strerror(s));
                exit(EXIT_FAILURE);
            printf("\t\taddress: <%s>\n", host);
        } else if (family == AF_PACKET && ifa->ifa_data != NULL) {
            struct rtnl_link_stats *stats = ifa->ifa_data;
            printf("\t\ttx_packets = %10u; rx_packets = %10u\n"
                    "\t\ttx_bytes   = %10u; rx_bytes   = %10u\n",
                    stats->tx_packets, stats->rx_packets,
                    stats->tx_bytes, stats->rx_bytes);
    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
                                    1、Bond的工作模式
Linux bonding驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用,用于网络负载均衡及网络冗余。
bonding一共有7种工作模式(mode):
1)、bond=0,(balance-rr) Round-robin policy: (平衡轮询策略):传输数据包顺序是依次传输,直到最后一个传输完毕,此模式提供负载平衡和容错能力。
2)、bond=1,(active-backup) Active-backup policy:(活动备份策略):只有一个设备处于活动状态。一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得。此模式提供了容错能力。
3)、bond=2,(balance-xor) XOR policy:(平衡策略):传输根据[(源MAC地址xor目标MAC地址)mod设备数量]的布尔值选择传输设备。 此模式提供负载平衡和容错能力。
4)、bond=3,(broadcast) Broadcast policy:(广播策略):将所有数据包传输给所有设备。此模式提供了容错能力。
5)、bond=4,(802.3ad) IEEE 802.3ad Dynamic link aggregation. IEEE 802.3ad 动态链接聚合:创建共享相同的速度和双工设置的聚合组。此模式提供了容错能力。每个设备需要基于驱动的重新获取速度和全双工支持;如果使用交换机,交换机也需启用 802.3ad 模式。
6)、bond=5,(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡):通道绑定不需要专用的交换机支持。发出的流量根据当前负载分给每一个设备。由当前设备处理接收,如果接受的设 备传不通就用另一个设备接管当前设备正在处理的mac地址。
7)、bond=6,(balance-alb) Adaptive load balancing: (适配器负载均衡):包括mode5,由 ARP 协商完成接收的负载。bonding驱动程序截获 ARP在本地系统发送出的请求,用其中之一的硬件地址覆盖从属设备的原地址。就像是在服务器上不同的人使用不同的硬件地址一样。
                                    TestBandwitdth脚本用于测试带宽;
//*****************************************************************************************
1.将“TestBandwidth.tar.gz”脚本copy到服务器上解压后,进入目录;
2.编辑“TestURL.sh”:灌流量;
  上行:wget  http://***
  下行:post  http://***
3.如果修改了步骤2,执行此步,否则跳过:
    修改 TestBandwidth.tar.gz 脚本中的倒数5-6行;
    kill -9 `ps -ef|grep wget|grep http|awk '{print $2}'`    //修改kill关键字:grep wget
    rm zhuxian*    //修改rm关键字:zhuxian*  
4.修改“bandwidth.sh”:修改检测网卡:
    netcard=em1 
5.使用后台运行命令执行:nohup ./bandwidth.sh  (注:停止脚本  pkill -9 bandwidth.sh && pkill -9 wget)
6.查看结果:BandwitdthResult.txt
//*********************************************************
测试流量:清空“TestURL.sh”文件时执行就是测试流量
//*****************************************************************************************
脚本说明:
1.调用TestURL.sh脚本启动灌流量操作;
2.等待10s(防止刚开始下载时的流量冲高);
3.取当前网卡已接收的上行、下行数据流量;
4.等待5s;
5.取当前网卡已接收的上行、下行数据流量;
6.计算两次取值中间的差值,算平均值;
7.等待10s,开始下一次小循环(循环4次)(一次小循环70s);
8.清除下载进程,清除下载文件,清除下载日志;
9.等待3495s,开始下一次大循环(一次大循环1h);
                                    拉风的咖菲猫我的2美分:即使是iOS,相同的代码也可以使用:#include #include #include #include #include #include #include #include #import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)vi...
                                    #include int main(int argc, char *argv[]){struct ifaddrs *ifaddr, *ifa;int family, s;char host[NI_MAXHOST];if (getifaddrs(&ifaddr) == -1) {    //通过getifaddrs函数得到所有网卡信息perror("getifaddrs");        ...
                                    ipv6地址处理代码的一部分::::charhost[NI_MAXHOST];if(family==AF_INET6){if(strcmp(ifa->ifa_name,eth)==0){s=getnameinfo(ifa->ifa_addr,sizeof(structsockaddr_in6),host,NI_MAXHOST,NULL,0,NI_NUMER...
socklen_t _addressLen ;//地址长度
socklen_t _peerAddressLen ;//对方地址的长度
struct sockaddr_in _sockAdd
                                    #include #include #include #include #include #include #include int main(int argc, char *argv[]){struct ifaddrs *ifaddr, *ifa;int family, s;char host[NI_MAXHOST];if (getifaddrs(&ifaddr) == -1) {per...
                                    #include int main(int argc, char* argv[]){struct ifaddrs *ifaddr_lst;struct ifaddrs *ifaddr_node;int family;char host[NI_MAXHOST];if(getifaddrs(&ifaddr_lst) < 0){perror("getifaddrs");return -1;...
                                    sjsam..23如果您正在寻找特定接口的地址(IPv4),请说wlan0然后尝试使用getifaddrs()的代码:#include #include #include #include #include #include #include #include int main(int argc, char *argv[]){struct ifaddrs *ifaddr, *ifa;int fam...
                                    ifu_dstaddr 如果(ifa_flags&IFF_POINTOPOINT)有效,ifu_dstaddr指向一个包含p2p目的地址的结构。ifu_broadaddr 如果(ifa_flags&IFF_BROADCAST)有效,ifu_broadaddr指向一个包含广播地址的结构。ifa_addr 指向一个缓冲区,其中包含地址族私有数据。ifa_addr 指向一个包含网络地址的sockaddr结构。ifa_netmask 指向一个包含网络掩码的结构。ifa_name 网络接口名。