日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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自动获取本地广播地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。