network模块小节

SIOCGMIIPHY 和 SIOCSMIIREG 命令 使用ioctl命令时,可以看到上述两个命令的存在, 在头文件 include/linux/sockios.h,定义如下: #define SIOCETHTOOL 0x8946 /* Ethtool interface */ ethtool 接口#define SIOCGMIIPHY 0x8947 /* Get address of ... 阅读详情

         网络是很多电子产品应用的基础,因此尤为重要。近期做的互联网电视项目 也是在建立在网络连接的基础之上,可惜我做的只是简单的porting层工作,对各种网络协议、应用以及底层驱动知之甚少。在这里小结一下network模块的工作流程。

        首先设备启动的时候会创建一个线程用来检测网络连接的状态,当网线拔出或者插上以及ip地址发生变化就会向显示界面发送相应的消息。目前是通过获取上一次网络连接状态和当前网络连接状态进行比较来判断该发送的消息类型,通过功能强大的ioctl函数。感觉这种实现方法不太好,可能会增加网卡的负担。接下来是获取DNS/IP/MAC/GATEWAY,如果获取不到IP说明网卡设备还没有正式进入工作状态,网络连接也还没有正式连通,因此需要在这里等待直到获取到IP或者能判断网络通,然后就向显示界面发送一条指定的消息,实现从初始化页面向主页面的跳转。因为进行网络连接的工作都是底层完成的,所以我的porting层的实际上只需要做对网络状态是否发生变化(插拔网线)进行检测,以及开机后等待直到网络连通之后发送跳转消息给界面的工作。

        这个过程中用到了几个通用的函数:

struct  ifreq
{
        #ifndef IFNAMSIZ
        #define IFNAMSIZ        16
        #endif

        char  ifr_name[IFNAMSIZ];
 
        union {
                struct  sockaddr ifru_addr;
                struct  sockaddr ifru_dstaddr;
                struct  sockaddr ifru_broadaddr;
                __ulong32_t      ifru_flags;
                int              ifru_metric;
                caddr_t          ifru_data;
                u_short          ifru_site6;
                __ulong32_t      ifru_mtu;
                int              ifru_baudrate;
} ifr_ifru;

 

 

一、检测网卡工作状态(物理连接)

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <net/if.h>

 

1.通过SIOCGIFFLAGS

static int network_get_netlink_status(const char *if_name)
{
	int skfd; 
	struct ifreq ifr = {0};

	if ((skfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		fprintf(stderr,"socket create failed/n");
		return LINK_ERR;
	}

	strcpy(ifr.ifr_name, if_name);
	if (ioctl(skfd,SIOCGIFFLAGS,&ifr) < 0)
	{
		fprintf("SIOCGIFFLAGS failed: %s/n", strerror(errno));

		close(skfd);
		return LINK_ERR;
	}
	if (ifr.ifr_ifru.ifru_flags & IFF_RUNNING)
		return LINK_UP;
	else
		return LINK_DOWN;
	
}

2.通过SIOCETHTOOL

static int network_detect_ethtool(int skfd, const char *if_name)
{
	struct ifreq ifr;
	struct ethtool_value edata;
	memset(&ifr, 0, sizeof(ifr));
	edata.cmd = ETHTOOL_GLINK;

	strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)-1);
	ifr.ifr_data = (char *)&edata;

	if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1)
	{
		printf("ETHTOOL_GLINK failed: %s/n", strerror(errno));
		return 2;
	}

	return edata.data;
} 

3.通过SIOCGMIIREG

static int network_detect_mii(int skfd,const char *ifname)
{
	struct ifreq ifr = {0};
	unsigned phy_id;
	unsigned short *data, mii_val;
	
	strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
	if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0)
	{
		fprintf(stderr, "SIOCGMIIPHY failed: %s/n",strerro(errno));
		(void) close(skfd);
		return 2;
	}

	data = (u16 *)(&ifr.ifr_data);
	phy_id = data[0];
	data[1] = 1;
	
	if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)
	{
		fprintf(stderr, "SIOCGMIIREG failed: %s/n", strerror(errno));
		return 2;
	}
//      mii_val |= data[3];   
	mii_val = data[3];
	return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);
} 

 

二、检测接口的inet addr,Bcast ,Mask

const int network_get_eth_info(const char *if_name)
{
	int sockfd;
	char	*address = NULL;
	struct ifreq ifr = {0};
	struct sockaddr_in *addr = {0};

	if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		printf("socket create failed.");
		return 2;
	}

	strncpy(ifr.ifr_name,if_name,IFNAMSIZ-1);

	if(ioctl(sockfd,SIOCGIFADDR,&ifr) < 0)
	{
		printf("SIOCGIFADDR on %s failed: %s/n", if_name, strerror(errno));
		return 2;
	}
	
	addr = (struct sockaddr_in *)&(ifr.ifr_addr);
	address = inet_ntoa(addr->sin_addr);
	printf("inet addr: %s ",address);

	if(ioctl(sockfd,SIOCGIFBRDADDR,&ifr) < 0)
	{
		printf("SIOCGIFADDR on %s failed: %s/n", if_name, strerror(errno));
		return 2;
	}
	addr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
	address = inet_ntoa(addr->sin_addr);
	printf("Bcast: %s ",address);

	if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) < 0)
	{
		printf("SIOCGIFADDR on %s failed: %s/n", if_name, strerror(errno));
		return 2;
	}
	addr = (struct sockaddr_in *)&ifr.ifr_addr;
	address = inet_ntoa(addr->sin_addr);
	printf("Mask: %s ",address);
	printf("/n");
	return 0;

} 

三、检测接口的MAC地址

static int network_get_mac(const char *if_name, void *arg)
{   
	int skfd;
	u_char * ptr;
	char *mac = (char *)arg;
	struct ifreq ifr = {0}; 
	
	if (NULL == arg)
	{
		fprintf(stderr, "(out)arg is null");
		return -1;
	}

	if ((skfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		fprintf(stderr, "create socket failed/n");
		return -1;
	}

	strcpy(ifr.ifr_name, if_name);
	if (ioctl(skfd,SIOCGIFHWADDR,&ifr) < 0)
	{
		fprintf(stderr, "(out)SIOCGIFHWADDR failed: %s", strerror(errno));
		return -1;
	}
	
	ptr =(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0]; 
	sprintf(mac, "%02x-%02x-%02x-%02x-%02x-%02x",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));

	return 0;
}

四、获取网卡设备名

static int network_get_interface_name(char (*interface_name)[10])
{
	int skfd;
	int i, len, count;
	char *ifreq_pointer = NULL;
	struct ifreq *result = NULL;
	struct ifconf get_info = {0};
	
	len = 10 * sizeof(struct ifreq);
	ifreq_pointer = (char *)calloc(1, len);
	
	get_info.ifc_len = len;
	get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;
	
	if ((skfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		fprintf(stderr, "create socket failed/n");
		free(ifreq_pointer);
		ifreq_pointer = NULL;
		return -1;
	}

	if (ioctl(skfd, SIOCGIFCONF, &get_info) < 0)
	{
		fprintf(stderr, "SIOCGIFCONF failed: %s", strerror(errno));
		free(ifreq_pointer);
		ifreq_pointer = NULL;
		return -1;
	}
	
	count = get_info.ifc_len / sizeof(struct ifreq);
	
	result = (struct ifreq *)ifreq_pointer;
	for(i=0; i<count; i++)
	{
	   	strcpy(interface_name[i], result[i].ifr_name);
		fprintf(stderr, "the %d interface name: %s/n", i, interface_name[i]);
	}
	
        free(ifreq_pointer);
	ifreq_pointer = NULL;
		
	return count;
}

void main()
{
    int count = 0;
    char eth_name[5][10] = {0};
    
    count =  network_get_interface_name(eth_name);
} 

五、获取IP地址

static int network_get_ipaddr(char *interface_name, char *ipaddr)
{
	int sockfd;
	
	struct ifreq ifr;
	struct sockaddr_in *sin;

	if((NULL == interface_name) || (NULL == ipaddr))
	{
		printf("Error argument \n");
		return -1;
	}
	
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		printf("Socket error \n");
		return -1;
	}	
	
	bzero((char *)&ifr, sizeof(ifr));
	strcpy(ifr.ifr_name, interface_name);
	
	if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
	{
		printf("ioctl SIOCGIFADDR failed: %s", strerror(errno));
		return -1;
	}
	
#if 1
	sin = (struct sockaddr_in *)&ifr.ifr_addr;
	strcpy(ipaddr, (char *)inet_ntoa(sin->sin_addr));
	
#else
	struct sockaddr_in * ptr;
	ptr = (struct sockaddr_in *)&(ifr.ifr_ifru.ifru_addr);
	memcpy((char*)ipaddr, (char*)&ptr->sin_addr, sizeof(unsigned long));
	*ipaddr = swap32(*ipaddr);
	printf("IP = %s \n",inet_ntoa(ptr->sin_addr));
#endif

	close(sockfd);
	
	return 0;
}


 

PHY寄存器驱动调试总结 前段时间对PHY芯片进行了调试,在此做个记录总结。 阅读详情

相关推荐

论文阅读:Multi-Scale Boosted Dehazing Network with Dense Feature Fusion

代码:https://github.com/BookerDeWitt/MSBDN-DFF 目录1. 摘要2. 提出的方法2.1 Multi-Scale Boosted Dehazing Network2.2 SOS Boosted Module1) Boosting in image dehazing2) Deep boosted dehazing network3) Alternatives to SOS boosted module2.3 Dense Feature Fusion Module2.4 .

space_walk的博客 6870

ioctl函数的SIOCGIFFLAGS和SIOCSIFFLAG

其中,socket_fd是已打开的套接字文件描述符,ifr是ifreq结构体类型的变量,该结构体包含了要操作的网络接口的名称。如果该操作成功,ifr结构体中的if_flags成员将包含接口的标志。是ifreq结构体类型的变量,该结构体包含了要操作的网络接口的名称和要设置的标志。如果该操作成功,接口的标志将被设置为if_flags成员中指定的值。S是指socket,IO是指input/output,CG是指get,CS是指set,IFFLAGS是指interface flags,因此。

qq_45572853的博客 4531

systemd.network网络配置

译者:金步国 描述 网络配置的操作由 systemd-networkd.service(8) 执行。 注意,网络设备的Network文件必须以 .network 作为后缀名,否则将被忽略。 一旦与Network文件匹配的网卡出现,对应的Network文件就会立即生效。 Network文件分别位于: 系统网络目录(/usr/lib/systemd/network)、 运行时网络目录(/run/systemd/network)、 本机网络目录(/etc/systemd/network)。 所有的Network文

Huangxiang6的博客 8214

SIOCGIFFLAGS, SIOCSIFFLAGS

SIOCGIFFLAGS, SIOCSIFFLAGS 读取 或 设置 设备的 活动标志字. ifr_flags 包含 下列值 的 屏蔽位: 设备标志 IFF_UP 接口正在运行. IFF_BROADCAST 有效的广播地址集. IFF_DEBUG 内部调试标志. IFF_LOOPBACK 这是自环接口. IFF_POIN

eager7的专栏 2万+

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 618

VS Code配置Java开发环境避坑指南:从JDK到Spring Boot插件全流程

本文详细介绍了在VS Code中配置Java开发环境的完整流程,涵盖JDK选择、环境变量配置、核心插件安装、构建工具优化及Spring Boot项目专项设置。特别针对常见问题提供避坑方案,帮助开发者快速搭建高效稳定的开发环境,提升Java和Spring Boot开发效率。

weixin_28839699的博客 982

linux程序如何检测网卡状态

使用socket+ioctl。 举例如下: #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <getopt.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <stdlib

yuhengyue的博客 1411

玩转ubuntu18 --机器视觉方面(yolo算法识别及摄像头和cmake问题解决)

玩转ubuntu18 --机器视觉方面(yolo v3算法识别) 1.YOLO的简介 工作原理 先前的检测系统重新调整分类器或本地化器以执行检测。他们将模型应用于多个位置和比例尺的图像。图像的高分区域被视为检测。 我们使用完全不同的方法。我们将单个神经网络应用于整个图像。该网络将图像划分为区域,并预测每个区域的边界框和概率。这些边界框按预测概率加权。 我们的模型比基于分类器的系统具有几个优势。它在测试时间查看整个图像,因此其预测由图像中的全球上下文提供信息。它还通过单一网络评估进行预测,这与R-CNN等系统

qq_53951823的博客 1556

openstack self network使用(小节14)

highlight: tomorrow-night-bright theme: mk-cute @TOC controller2 参考文件:'neutron.conf' 注意这个文件一定要有颜色区分,否则后期会出问题 [root@controller2 ~]# vim /etc/neutron/neutron.conf [DEFAULT] service_plugins = rou...

Soul_2016的博客 397

深度学习的卷积神经网络的煤矸石识别

在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。1.项目需求对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。 2.项目实现 通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。 1.数据集:格式为jpg的3091张煤矸石图片2.YOLOv8环境配置yolo检测网络包括24个卷积层

2201_75355700的博客 792

告别Overleaf!本地LaTeX环境配置:VSCode+TeXLive完全指南(Windows/Mac双平台)

本文详细介绍了如何在Windows和Mac平台上配置本地LaTeX环境,使用VSCode和TeXLive打造高效的专业写作工作流。从TeXLive安装到VSCode插件配置,再到高级技巧与性能优化,帮助用户摆脱Overleaf限制,实现更快速、更私密的学术写作体验。

3c4x5z6v7b的博客 952

内涵:STN(spatial transformer network)论文与源码理解

近期对2015年的一篇较为经典的论文"spatial transformer networks(stn)"进行了研究。本博文是stn阅读心得的记录。在第二小节中,会描述stn的实现细节,包括三大组成构件:localisation network, Grid generator, Sampler。在第三小节中会通过跟踪stn源码(pytorch版本)来验证自己的理解。在第四部分作为扩展部分,会尝试从数学角度研究STN的可导性。

4275

YOLOv11改进策略【卷积层】| CVPR-2024 PKI Module 获取多尺度纹理特征,适应尺度变化大的目标

PKI Module是。

Limiiiing的博客 2710

gpnp Tools 使用方法小节

gpnp tools 使用方法小节

renfengjun 4598

Claude Code 实战 从零教你用 Claude Code 干活

Claude Code 实用指南:AI 编程助手的核心功能与使用技巧 Claude Code 是 Anthropic 推出的智能编程助手,可直接在本地环境中执行操作,相比传统 AI 对话工具具有显著优势:能直接读取项目文件、自动执行修改、记忆项目规则,并支持连接外部服务。本文详解其安装配置、三大核心场景(资料搜索、网页抓取、文章撰写)及进阶功能(Skills、MCP协议、斜杠命令)。特别提供了工作模式切换、CLAUDE.md配置文件等实用技巧,并附常见问题解决方案,帮助用户高效利用这一"坐在身边的

2401_84052244的博客 7542

2026华为OD机试(C语言)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C语言实现。

MISAYAONE的博客 11万+

【NIN】《Network In Network》

arXiv-2013 在 CIFAR-10 上的小实验可以参考博客 【Keras-NIN】CIFAR-10 文章目录1 Background and Motivation2 Advantages / Contributions2.1 Contributions2.2 Advantages3 Innovation4 Method4.1 MLP Convolution Layers4.2 Gl...

bryant_meng 561

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入awesome-network-js的BitTorrent DHT实现:从k-bucket到dht-rpc的完整原理剖析

awesome-network-js 是一份纯 JavaScript 编写的网络层资源精选清单,覆盖 P2P 应用、网络协议模块与协议实现三大板块。其中的 BitTorrent DHT 技术栈——从 k-bucket 路由表到 dht-rpc 远程调用层——是全网最系统的纯 JS 去中心化网络资料之一。本文完整拆解这条原理链路:DHT 是什么、k-bucket 路由表如何工作、k-rpc 消息如何

gitblog_00637的博客 866

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

论文笔记:Recurrent Neural Network Grammars

1.简介 “Recurrent Neural Network Grammars” 发表与NAACL 2016,这篇论文中提出了 RNNG 模型,在之后也有很多工作基于此,像URNNG(Unsupervised RNNG)和融合RNNG的NMT等。论文中首先介绍了RNNG的判别模型,然后进行了改动,定义了生成模型,然后又介绍了RNNG作为语言模型的效果。 2.定义基础 RNNG来源于统计自然语言处...

MirrorN的博客 1278

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

元学习——连体网络(Siamese Network)概念与结构

元学习——连体网络(Siamese Network) 1 概念和结构 1.1 引入 在介绍连体网络之前,我们首先来介绍单样本学习: **单样本学习:**所谓的单样本学习是我们对于每一个分类使用一个样本进行学习。 这种单样本学习的方式在我们实际上经常出现,举一个例子来说,假设我们需要构建一个人脸识别的系统中,我们的目标是识别500个人的人脸。但是我们手里面的数据只有500份,也就是每一个人拥有一张图片作为训练数据。在这个时候,如果我们想要使用CNN神经网络进行识别,我们需要很多的训练图片才能够对这500个人的

hei653779919的博客 4471

数据结构之网络流入门(Network Flow)简单小节

网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点。 汇点:另一个点也很特殊,只进不出,叫做汇点。 容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j]. 通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量<=容量。而对于每个不是源...

weixin_34128237的博客 113

Network Policy - 每天5分钟玩转 Docker 容器技术(171)

Network Policy - 每天5分钟玩转 Docker 容器技术(171) CloudMan2018-05-26 第171篇 Network Policy Network Policy 是 Kubernetes 的一种资源。Network Policy 通过 Label 选择 Pod,并指定其他 Pod 或外界如何与这些 Pod 通信。 默认情况下,所有 Pod 是非隔离的,即任何来源的网络流量都能够访问 Pod,没有任何限制。当为 Pod 定义了 Network Policy,只有 P.

jj1130050965的博客 197

Folia 全屏歌词动画播放器安装指南:四大桌面平台完整动线

下载慢、网盘和 Releases 两条渠道不知选哪条,装 Folia 很容易卡在第一关。Folia 是一款全屏歌词动画播放器:支持网易云、QQ 音乐、酷狗、Navidrome 与本地音乐库,提供 Windows、macOS、Linux 三个平台的官方桌面版。本文把下载、安装、首启三段动线按平台拆开,命令都能直接复制执行,读完就能播下第一首带歌词的歌。 ## 系统自检:30 秒确认你属于哪一类

gitblog_00295的博客 205

论文笔记之:Deep Attention Recurrent Q-Network

   Deep Attention Recurrent Q-Network 5vision groups       摘要:本文将 DQN 引入了 Attention 机制,使得学习更具有方向性和指导性。(前段时间做一个工作打算就这么干,谁想到,这么快就被这几个孩子给实现了,自愧不如啊( ⊙ o ⊙ ))     引言:我们知道 DQN 是将连续 4帧的视频信息输入到 CNN 当中,那么,这么做虽...

weixin_33966365的博客 162
上一篇: 记
下一篇: 时间在飞!
beyondzd2000
博客等级 码龄18年 24粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值