首页 > 编程语言 >TCP编程之网卡信息获取和域名解析

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

时间:2023-02-20 17:01:59浏览次数:45  
标签:addr int 域名解析 TCP 网卡 printf sockfd include struct

1.TCP/IP简介

TCP/IP协议源于1969年,是针对Internet开发的一种体系结构和协议标准,目的在于解决异种计算机网络的通信问题。使得网络在互联时能为用户提供一种通用、一致的通信服务。是Internet采用的协议标准。

 TCP/IP是一组通信协议的代名词,是由一系列协议组成的协议簇。它本身指两个协议集:

  TCP(传输控制协议)。

  IP(互联网络协议)。

 TCP/IP协议的基本传输单位是数据包(Datagram)。

 TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

2.获取本地网卡信息

ifconfig命令查询网卡信息。

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

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 地址必须指向的数据类型:

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

 获取网卡信息示例:

#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");
}
}
}

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

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));
}
}

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

4.获取邦定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)
{

}
}

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

标签:addr,int,域名解析,TCP,网卡,printf,sockfd,include,struct
From: https://blog.51cto.com/u_15688123/6068057

相关文章

  • RT3070L_USB_WIFI网卡在GT2440开发板上的移植和使用(四)--dhcp移植
    6、dhcp的移植和应用6.1、源码准备(1)源码下载:ftp://ftp.isc.org/isc/(2)源码文件确认:dhcp-4.2.5-P1.tar.gz6.2、编译dhcp(如果不想看一步步的解决过程,可以跳过1,直接看2)(1)......
  • Windows QT程序配置删除网卡IP
    1、Windows下可在CMD控制终端使用Dos命令对指定网卡进行IP配置,需要使用管理员权限打开CMD终端往网卡添加IP主要有以下两种方法:方法1:netshinterfaceipaddaddress“......
  • Mina Tcp服务器开发
    因项目架构需求,需要开发一个MinaTcp服务器。我的Mina服务器是JavawinForm,这与在web项目使用会有少许不同。1、Maven依赖<dependency><groupId>o......
  • TCP网络编程常用指令
    1.netstat指令netstat-an查看当前主机网络情况,包括端口监听情况和网络连接情况netstat-an|more分页显示显示如下: 含义解读:协议:表示使用的协议本......
  • 记TCP触发海康相机识别二维码时的问题。
    背景:在一个项目中用TCP通讯的方式触发海康相机进行二维码识别并回传二维码信息。问题:在测试过程中发现经常会有读取到的信息是上一个产品的二维码信息。原因分析:在TCP通......
  • Epoll原理解析--网卡接收数据说起
     转至 https://blog.csdn.net/armlinuxww/article/details/92803381 太重要了怕丢失,冒昧转一下  从网卡接收数据说起下边是一个典型的计算机结构图,计算机由CPU......
  • kepserver作为ModbusTcp服务器与外围设备通信
    1,通道配置关键参数     2,设备配置关键参数 ......
  • 学习TCP/IP(4):网际协议 IPv4-转发IP数据报
    学习TCP/IP(4):网际协议IPv4-转发IP数据报引言在网络的世界里,数据报转发可以分为两种类型:直接交付和间接交付。直接交付直接交付是指把数据报从一台机器通过物理网络......
  • 学习TCP/IP(1):分类的Internet地址
    学习TCP/IP(1):分类的Internet地址一个互联网主机可由名字(Names),地址(Address),路由(Route)来进行标识。Shoch是这样定义这三个术语的:Names,即名字,标识这个对象是什......
  • 学习TCPIP(2)-ARP协议
    学习TCPIP(2)-ARP协议ARP协议是这样一个协议:它负责将高层地址(IP地址)映射为底层物理地址(MAC地址)其中,IP地址是针对于TCPIP网络而言的,当目的地是网络A的主机H一个数据包抵......