让技术·去旅行

点击上方蓝字可以关注我们哦

本文以函数形式做笔记,因为函数模块式编程,可以大大提升代码的可读性。

首先来了解ifreq 这个结构体

1、结构定义

struct ifconf {     int ifc_len;     union 

2、用法说明

ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而 ifconf结构通常是用来保存所有接口的信息的。

然后浅谈一下ioctl函数

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。具体操作,自行百度深入

函数原型为:

本函数影响由fd参数引用的一个打开的文件。

#include

int ioctl( int fd, int request, .../* void *arg */ );

返回0:成功 返回-1:出错

第三个参数总是一个指针,但指针的类型依赖于request参数。

本文函数调用如下

//直接获取指定网卡的地址信息到ifr结构体里面

ioctl(skt_fd, SIOCGIFADDR, &ifr);

接下分析如何获取本地广播地址

前言:

在main函数调用这个函数是这样子的

函数名字:get_netcard_broadcase_addr

函数功能:根据网卡名字获取IP地址是多少

get_netcard_broadcase_addr(udp_fd, "ens38", broadcase_addr,                sizeof(broadcase_addr));

参数分析:

udp_fd: socket文件描述符

ens38 :网卡名字

broadcast_addr: 用来存放网络通信信息 ,需要提前定义struct sockaddr_in  broadcast_addr

struct sockaddr_in 这个结构体用来处理网络通信的地址,比如说把类型、ip地址、端口填充sockaddr_in结构体

sizeof(broadcase_addr):结构体的大小

具体实现,请左右滑动阅读代码,注释步步到位

int get_netcard_broadcase_addr(int skt_fd, char *netcard_name, char *ip_addr, int ip_len){  int retval;  struct ifreq ifr;  struct sockaddr_in get_addr, cache_addr;  unsigned int addr_numb;

  bzero(&ifr, sizeof(ifr));//内存清空

  strcpy(ifr.ifr_name, netcard_name);//将网卡名字放入到ifr.ifr_name的内存当中,指定好网卡的名字

  retval = ioctl(skt_fd, SIOCGIFADDR, &ifr);//直接获取指定网卡的地址信息到ifr结构体里面  if(retval != 0)  {    perror("获取指定网卡IP地址失败");    return -1;  }

  memcpy(&get_addr, &(ifr.ifr_addr), sizeof(get_addr));//将地址信息拷贝到get_addr结构体里面拿来分析

  addr_numb = ntohl(get_addr.sin_addr.s_addr);//将网络字节数的二进制IP地址转化为本地字节序的二进制IP地址,方便我们下面做IP地址类型的判断

  printf("本机ip地址:%s\n", inet_ntoa(get_addr.sin_addr));//将获取到的网卡IP地址打印出来

  if((addr_numb & 0xe0000000) <= 0x60000000)//保留32位IP地址的前三位数据,并且判断,A类地址由于是0开头,所以保留前面3位的最大值是011和面都是0,十六进制数就是0x60000000  {      cache_addr.sin_addr.s_addr = htonl(addr_numb|0x00ffffff);//如果他是A类地址,他的网络地址则是前8位二进制,剩下的24位都是主机地址,全部置1便是广播地址(255就是全部都是1),并且转化为网络字节序存放进去变量当中

      printf("这个是A类地址,广播地址为%s\n", inet_ntoa(cache_addr.sin_addr));//将广播地址打印出来  }  else if((addr_numb & 0xe0000000) <= 0xa0000000)//同理,B类地址10开头,保留3位则是101是最大值,所以十六进制是0xa0000000  {      cache_addr.sin_addr.s_addr = htonl(addr_numb|0x0000ffff);

      printf("这个是B类地址,广播地址为%s\n", inet_ntoa(cache_addr.sin_addr));  }  else if((addr_numb & 0xe0000000) <= 0xc0000000)//同理,C类地址110开头,保留3位则是110是最大值,所以十六进制是0xc0000000  {      cache_addr.sin_addr.s_addr = htonl(addr_numb|0x000000ff);

      printf("这个是C类地址,广播地址为%s\n", inet_ntoa(cache_addr.sin_addr));  }  else    printf("这个是D类地址(组播地址)");

  strncpy(ip_addr, inet_ntoa(cache_addr.sin_addr), ip_len);

  return 0;}

最后验证这个函数,如下图所示:

该函数运用到下面题目中

通过UDP,当A运行的时候其他同一个网段的B程序可以收到A上线的通知,并且都跟A程序说一句“”你好,大佬“”;

  如果需要此题目程序代码,后台回复【UDP01】获取

记录点点滴滴的笔记欢迎关注,共同学习

小浩笔记

bzero函数_函数模块 | UDP自动获取本地广播地址相关推荐

  1. 【九】Python全栈之路--文件函数_函数参数

    文章目录 1. 文件相关函数 2. 函数_函数的参数 2.1 函数 2.2 函数的参数 3. 收集参数 4. 命名关键字_总结 4. 小练习 1. 文件相关函数 # ### 刷新缓冲区 "& ...

  2. matalb中的wden函数_小波分析中MATLAB阈值获取函数及其应用附程序代码

    小波分析中MATLAB阈值获取函数及其应用附程序代码 1.小波分析中MATLAB阈值获取函数 MATLAB中实现阈值获取的函数有ddencmp.thselect.wbmpen和wwdcbm,下面对它们 ...

  3. QT udp自动获取对方ip和端口号

    Tip: 用printf打印QString方法如下: QString output printf("%s\n",output.toStdString().data()); 正文:Q ...

  4. 用python做生物信息数据分析_基于Python的自动获取生物信息数据的软件设计

    基于 Python 的自动获取生物信息数据的软件设计 * 周斯涵,刘月兰 ** [摘 要] [摘 要] 从国际生物信息学数据库中采集数据来进行相关领域的分析, 但随着数据库规模不断扩大 , 数据来源种 ...

  5. 中gcd函数_函数和模块的使用

    没有谁的生活会一直完美,但无论什么时候,都要看着前方,满怀希望就会所向披靡.--<撒野> 一.实现计算求最大公约数和最小公倍数的函数 初版 def gcd(a,b): if a % b = ...

  6. java当前时间函数_在JAVA中如何获取当前日期

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  7. Java有没有lower_bound函数_函数 - lower_boundupper_bound

    lower_bound&upper_bound - 二分查找函数 它们是C++自带的函数,用于在有序的数列里进行查找.注意,一定是有序的 它们使用的是二分查找的方法,时间复杂度为O(logn) ...

  8. favicon自动获取_友情链接前面自动获取并添加favicon.ico小图标

    之前看到可风博客底部友情链接都加了ico小图标,感觉很新颖,很好看.于是乎我也开始折腾,我不想每次添加友情链接的时候都得手动的去添加ico图标的小链接,浪费时间,然后就百度了以下,还真有教程,然后我就 ...

  9. java+fseek+函数_函数fseek() 用法(转)

    在阅读代码时,遇到了很早之前用过的fseek(),很久没有用了,有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h fseek 函数名: fseek 功 ...

最新文章

  1. MFC调用批处理文件(.bat)
  2. java word分词器使用_word分词器使用(java)
  3. python numpy np.lexsort()(使用键序列执行间接稳定排序)(具体没太搞懂区别?)
  4. 类属性-类属性的定义及使用
  5. Java 11:新的HTTP客户端API
  6. 第十三届东北师范大学程序设计竞赛热身赛 C(exgcd+欧拉函数)
  7. vue-cli关闭eslint及配置eslint
  8. Java中sleep,wait的区别
  9. shell 传递参数
  10. office 论文 页码_原创:如何设置毕业论文的页眉和页码(word2007和word2010)
  11. geogebra几何画图工具用法
  12. 再肝一个R包!一行代码绘制精美火山图!
  13. Java实现规则几何图形问题求解
  14. 纯css绘制齿轮加载动画
  15. html文件wps怎么打开,wps怎么打开xlsb文件
  16. Arduino灰度传感器PID巡线
  17. 联想拯救者7000充不上电的解决办法
  18. 事件介绍、两种事件注册的介绍、onload事件、onclick事件、onblur事件、onchange事件、onsubmit事件
  19. 安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写
  20. 静态网页抓取_学习笔记

热门文章

  1. jquery autocomplete demo
  2. 命名实体识别NER遗留问题----模型构建
  3. LeetCode简单题之杨辉三角
  4. TensorFlow XLA优化与Memory
  5. 10分钟内基于gpu的目标检测
  6. 2021年大数据常用语言Scala(十):基础语法学习 方法
  7. python 判断字符串是否全部为数字组成(使用isdigit)
  8. Android 使用adb 抓取日志信息
  9. android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating
  10. Android编程:解决异常“android.view.InflateException: Binary XML file line # : Error inflating class”