1.tcp/ip简介 tcp/ip协议源于1969年,是针对internet开发的一种体系结构和协议标准,目的在于解决异种计算机网络的通信问题。使得网络在互联时能为用户提供一种通用、一致的通信服务。是internet采用的协议标准。
tcp/ip是一组通信协议的代名词,是由一系列协议组成的协议簇。它本身指两个协议集:
tcp(传输控制协议)。
ip(互联网络协议)。
tcp/ip协议的基本传输单位是数据包(datagram)。
tcp/ip传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。tcp/ip传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,tcp/ip传输协议是保证网络数据信息及时、完整传输的两个重要的协议。tcp/ip传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
2.获取本地网卡信息 获取本地网卡信息的方法有很多种,在linux命令行下我们可以通过ifconfig命令查询网卡信息。
2.1 通过ioctl函数获取网卡信息 ioctl(input/output control)是一个专用于设备输入输出操作的系统调用,该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。
ioctl函数原型:#include int ioctl(int fd, unsigned long request, ...);形参:fd --文件描述符 request --请求命令 第三个参数为可变参数,该参数填写取决于request 命令;返回值:一般成功返回0 网络相关的请求划分为6 类:
套接口操作 文件操作 接口操作 arp 高速缓存操作 路由表操作 流系统 下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:
获取网卡信息示例:
#include #include #include #include #include #include #include #include int main(){ int i=0; int sockfd; /*创建网络套接字*/ if((sockfd = socket(af_inet, sock_stream,0))< 0) { printf(socket errorn); return -1; } struct ifreq ifcu_req[4];//网卡信息结构体 struct ifconf ifc= { .ifc_len=sizeof(ifcu_req),//缓冲区大小 .ifc_req=ifcu_req, }; struct ifreq b_addr; int ret=ioctl(sockfd,siocgifconf, &ifc);//获取网络接口信息 struct sockaddr boardaddr; struct sockaddr_in addr; printf(ret=%dn,ret); char mac[6]; int j=0; int count=ifc.ifc_len/sizeof(struct ifreq);//计算获取到的网卡信息个数 for(i=0;i< count;i++) { printf(n------------%s---------------------n,ifcu_req[i].ifr_name); memcpy(&addr,&ifcu_req[i].ifr_addr,sizeof(addr)); printf(ip地址: %s n,inet_ntoa(addr.sin_addr)); /*广播地址*/ if (ioctl(sockfd, siocgifbrdaddr, &ifcu_req[i]) == 0) { memcpy(&addr,&ifcu_req[i].ifr_broadaddr, sizeof(addr)); printf(广播地址: %s n,inet_ntoa(addr.sin_addr)); } /*子网掩码*/ if (ioctl(sockfd, siocgifnetmask, &ifcu_req[i]) == 0) { memcpy(&addr,&ifcu_req[i].ifr_broadaddr, sizeof(addr)); printf(子网掩码: %s n,inet_ntoa(addr.sin_addr)); } /*mac地址*/ if (ioctl(sockfd, siocgifhwaddr, &ifcu_req[i]) == 0) { memcpy(mac,&ifcu_req[i].ifr_hwaddr.sa_data[0],6); printf(mac地址:); for(j=0;jh_name); for(i=0;host_info- >h_aliases[i]!=0;i++) { printf(主机别名:%sn,host_info- >h_aliases[i]); } for(i=0;host_info- >h_addr_list[i]!=0;i++) { memcpy(&addr,host_info- >h_addr_list[i],sizeof(addr)); printf(ip地址:%sn,inet_ntoa(addr)); }} 运行效果:
获取邦定ip地址信息getsockname
getsockname()函数用于获取一个套接字的名字。它用于一个已捆绑或已连接套接字,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。
#include int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);函数功能:获取sockfd绑定的ip地址和端口号信息形 参:sockfd --网络套接字 addr --保存返回的ip地址和端口号信息 addrlen --addr缓冲区大小(必须由用户设置大小,函数调用成功返回实际addr大小)返回值:成功返回0,失败-1 示例:
AMD即将推出的Ryzen9 5900HX移动APU跑分取得好成绩
抄表无线传输应用方案
田中精机表示可制造无线耳机部分组件
戴尔宣布推出Alienware外星人台式主机
高通骁龙汽车数字座舱平台助力汽车自动化
TCP编程之网卡信息获取和域名解析
示波器测量交流电压不能接地的原因和必要性
荣耀9X PRO新配色五光十色白版即将发布该机拥有六大亮点
坚果pro、360N5、酷玩6评测对比,你会怎么选?
VCSEL相对于EEL(边发射器)和LED光源,有着独特的优势
区块链交互与价值网络是怎样实现的
快充和闪充两者有什么区别
聚芯微电子完成数千万元A轮融资,打造行业领先的3D视觉解决方案
新的PMP技术让三星Galaxy S11的续航能力更为出色
无刷电机振动和噪声的分析
外骨骼机器人的概述与分类
10款常见的稳压电源器件解析
音乐频谱LED显示屏驱动控制程序案例解析
双调光蘑菇灯与维修
监控系统中经常被忽略的故障原因