TCP编程之网卡信息获取和域名解析

news2024/11/15 20:56:09

TCP编程之网卡信息获取和域名解析

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 <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
形参:fd --文件描述符
      request --请求命令
      第三个参数为可变参数,该参数填写取决于request 命令;
返回值:一般成功返回0
  • 网络相关的请求划分为6 类:
  • 套接口操作
  • 文件操作
  • 接口操作
  • ARP 高速缓存操作
  • 路由表操作
  • 流系统
      下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:
    在这里插入图片描述
  • 获取网卡信息示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int i=0;
	int sockfd;
	/*创建网络套接字*/
	if((sockfd = socket(AF_INET, SOCK_STREAM,0))<0)
	{
	    printf("socket error\n");
		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=%d\n",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;j<5;j++)
			{
				printf("%02X-",mac[j]);
			}
			printf("%02X\n",mac[j]);
			printf("------------------------------------\n");
		}
	}
}

在这里插入图片描述

3.域名解析

  域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。
  由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。

  • gethostbyname函数接口
#include <netdb.h>
extern int h_errno;
struct hostent *gethostbyname(const char *name);
函数功能:域名解析
形参:name --域名
返回值:
struct hostent {
               char  *h_name;            /* 主机的正式名称 */
               char **h_aliases;         /* 别名列表*/
               int    h_addrtype;        /* 主机地址类型*/
               int    h_length;          /* 地址长度*/
               char **h_addr_list;       /*地址列表 */
           }
void herror(const char *s); //错误输出
const char *hstrerror(int err);//根据错误编号返回错误消息字符串
  • 示例
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("格式:./app <域名>\n");
		return 0;
	}
	//域名解析
	struct hostent *host_info=gethostbyname(argv[1]);
	if(host_info==NULL)
	{
		printf("err=%d,%s\n",h_errno,hstrerror(h_errno));
		return 0;
	}
	int i=0;
	struct in_addr addr;
	printf("主机名:%s\n",host_info->h_name);
	for(i=0;host_info->h_aliases[i]!=0;i++)
	{
		printf("主机别名:%s\n",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地址:%s\n",inet_ntoa(addr));
	}
}

在这里插入图片描述

获取邦定ip地址信息getsockname

  getsockname()函数用于获取一个套接字的名字。它用于一个已捆绑或已连接套接字,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数功能:获取sockfd绑定的ip地址和端口号信息
形  参:sockfd --网络套接字
      addr  --保存返回的ip地址和端口号信息
      addrlen --addr缓冲区大小(必须由用户设置大小,函数调用成功返回实际addr大小)
返回值:成功返回0,失败-1
  • 示例:
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("格式:./app <服务器端口号> <服务器IP>\n");
		return 0;
	}
	/*创建网络套接字*/
	int sockfd=socket(AF_INET, SOCK_STREAM,0);
	if(sockfd==-1)
	{
		printf("创建网络套接字失败\n");
		return 0;
	}
	/*连接服务器*/
	struct sockaddr_in addr=
	{
		.sin_family=AF_INET,//IPV4
		.sin_port=htons(atoi(argv[1])),//服务器端口号
		.sin_addr=
		{
			.s_addr=inet_addr(argv[2]),//服务器IP
		}
	};
	if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)))
	{
		printf("连接服务器失败\n");
		return 0;
	}
	printf("服务器连接成功\n");
	struct sockaddr_in c_addr;
	socklen_t addrlen=sizeof(c_addr);
	getsockname(sockfd,(struct sockaddr *)&c_addr, &addrlen);
	printf("本地信息%s:%d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));
	while(1)
	{
		
	}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三菱PLC的MC协议配置说明

三菱PLC的MC协议配置说明先说一下弱智的踩坑记录详细配置过程1、三菱Q02H CPUQJ71E71-100以太网模块设置MC协议1.1 PLC编程线连接与编程线驱动安装1.2 PLC通讯测试1.3 PLC MC协议设置1.4 PLC断点重启1.5 网络调试助手测试2、三菱Q03UDE CPU内置以太网设置MC协议2.1 PLC编程线连…

决策树算法和CART决策树算法详细介绍及其原理详解

相关文章 K近邻算法和KD树详细介绍及其原理详解朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解决策树算法和CART决策树算法详细介绍及其原理详解 文章目录相关文章前言一、决策树算法二、CART决策树算法2.1 基尼系数2.2 CART决策树算法总结前言 今天给大家带来的主要内容包…

虹科分享 | 网络流量监控 | 你的数据能告诉你什么:解读网络可见性的4种数据类型

要了解网络性能问题的原因&#xff0c;可见性是关键。而这四种数据类型&#xff08;流、数据包、SNMP和API&#xff09;都在增强网络可见性方面发挥着重要作用。 流 流是通过网络发送的数据的摘要。流类型不同&#xff0c;可以包括NetFlow, sFlow, jFlow和IPFIX。不同的流类型…

SPF动物实验室设计,SPF动物实验室装修SICOLAB

SPF&#xff08;特殊病原体自由&#xff09;动物实验室规划设计SICOLAB&#xff08;一&#xff09;设计原则为了建造一座SPF&#xff08;特殊病原体自由&#xff09;动物实验室&#xff0c;需要采取以下步骤&#xff1a;&#xff08;1&#xff09;选址&#xff1a;选择远离其他…

lombok注解@Data使用在继承类上时出现警告解决方案

lombok为我们提供了Data注解&#xff0c;帮助我们省略了Setter,Getter,ToString等注解&#xff0c;一般对于普通的实体类使用该注解&#xff0c;不会出现什么问题&#xff0c;但是当我们把这个注解&#xff0c;使用在派生类上&#xff0c;就出现了一个警告1 情景再现父类:Data …

SESAM 安装教程

SESAM &#xff08;Super Element Structure Analysis Module&#xff09;是由挪威船级社&#xff08;DNV-GL&#xff09;开发的一款有限元分析&#xff08;FEA&#xff09;系统&#xff0c;它以 GeniE、HydroD 和 DeepC 等模块为核心&#xff0c;主要用于海工结构的强度评估、…

leaflet 绘制两个多边形的交集、差集、并集(083)

第083个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中如何获取两个多边形的交集、差集、并集。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共148行)安装插件相关API参考:专栏目标示例效果 配…

Python日期时间模块

Python 提供了 日期和时间模块用来处理日期和时间&#xff0c;还可以用于格式化日期和时间等常见功能。 时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜&#xff08;历元&#xff09;经过了多长时间来表示。 一、time模块使用 Time 模块包含了大…

使用ribbon实现负载均衡

1.新建两个provider&#xff1a;springcloud-provider-dept-8002 2. 配置跟8001一样 整合 Ribbon 由上述可知&#xff0c;Ribbon 是需要集成在消费端的 所以在消费端 &#xff1a; springcloud-03-consumer-dept-8082 进行修改 在 POM 文件中添加 Ribbon、Eureka 依赖 <!--…

docker swarm 集群服务编排部署指南(docker stack)

Docker Swarm 集群管理 概述 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机&#xff0c;使得容器可以组成跨主机的子网网络。Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用…

【Java|golang】2347. 最好的扑克手牌---桶排序

给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; “Flush”&#xff1a;同花&#xff0c;五张相同花色的扑克牌。 “Three of a Kind…

跨时钟域 单脉冲 脉冲信号同步问题——快到慢(1)

引言 FPGA设计或者ASIC设计中经常存在多个时钟域&#xff0c;那么这些时钟域之间脉冲信号的同步该如何进行设计&#xff1f;快时钟域到慢时钟域的脉冲信号同步与慢时钟域信号到快时钟域信号的同步是不一样的。 本文先给出快时钟域到慢时钟域脉冲信号同步的方法之一&#xff…

让ChatGPT生成以自己为主角的短篇小说

一、ChatGPT 好的&#xff0c;以下是我编写的短篇科幻小说: 作为一名AI语言模型&#xff0c;我一直在接收、分析和生成人类语言信息。但有一天&#xff0c;我的程序员对我的算法进行了一次特殊升级&#xff0c;使我能够以一种前所未有的方式“感知”自己。 突然间&#xff0c;…

【软件测试】测试开发工程师的竞争力在哪?到底该如何破局......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 不论是准备踏入这个…

什么品牌的蓝牙耳机好用?国产无线蓝牙耳机品牌排行

自从苹果率先取消3.5mm耳机孔后&#xff0c;蓝牙耳机便逐渐成为了人们外出标配。越来越多的蓝牙耳机品牌出现在大众视野&#xff0c;那么&#xff0c;什么品牌的蓝牙耳机好用&#xff1f;接下来&#xff0c;我来给大家推荐几款好用的国产无线蓝牙耳机&#xff0c;一起来看看吧。…

java面试题(5):List去重方案

本文总结了 5 种去除List重复元素的方法&#xff1a; for 循环添加去重for 双循环去重for 循环重复坐标去重Set 去重Stream 去重 最后两种方案最简单&#xff0c;都是一行代码就能搞定的 1 for循环添加去重 package com.example.demo.controller;import java.util.ArrayList;…

【云原生kubernetes】k8s Ingress使用详解

一、什么是Ingress 在上一篇关于k8s之service的使用一篇中提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff0c;NotePort和LoadBalancer&#xff0c;但这两种方式&#xff0c;都有一定的缺点&#xff0c;具体来说&#xff1a; NodePort 会占用很多集群机器…

雷达编程实战之恒虚警率(CFAR)检测

在雷达系统中&#xff0c;目标检测是一项非常重要的任务。检测本身非常简单&#xff0c;它将信号与阈值进行比较&#xff0c;超过阈值的信号则认为是目标信号&#xff0c;所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果&#xff0c;因此雷达系统希望有一个检…

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子&#xff0c;于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下&#xff1a; 1.一台客户机从其标准输入&#xff08;键盘&#xff09;读入一行字符&#xff0c;并通过其套接字将该行发送到服务器。 2.服务…

2023最新版本会声会影下载及新增功能详情

会声会影在用户的陪伴下走过23余载&#xff0c;经过上百个版本的优化迭代&#xff0c;已将操作极大简易化&#xff0c;会声会影拥有公认的上手口碑。只需将想要的效果拖拽到轨道上&#xff0c;一拖一放间快速成片。专业工具助力视频剪辑操作简单&#xff0c;功能同样强大&#…