bzero函数_函数模块 | UDP自动获取本地广播地址
讓技術·去旅行
點擊上方藍字可以關注我們哦
本文以函數形式做筆記,因為函數模塊式編程,可以大大提升代碼的可讀性。
首先來了解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自动获取本地广播地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双流兔头多少钱一个?
- 下一篇: 3月底要去八大处割双眼皮了,好紧张~!有