Linux 网络之IP转换

一个IP地址是有小数点分开的十进制数表示的,我们称为点分十进制表示法。其中每一个十进制数代表一个字节的无符号数值(按照网络字节序)因为每个字节都是无符号的8位数值,这就限制了每一个字节所能表示的范围是0~255。

特殊的IP

  • 每一个字节都为0的地址("0.0.0.0")对应于当前主机;
  • IP地址中的每一个字节都为1的IP地址("255.255.255.255")都是当前子网的广播地址;
  • IP地址中凡是以"11110"开头的E类IP地址都保留用于将来和实验使用;
  • IP地址中不能以十进制"127"作为开头,该类地址中数字127.0.0.1 到 127.255.255.255 用于回路测试;如 127.0.0.1 可以代表本机IP地址;
  • 网络ID的第一个8位组也不能全置"0",全"0"表示本地网络。

操作IP地址的相关函数

in_addr_t inet_addr(const char *string);

这个函数使用string作为输入参数,并将这个点分十进制的IP地址转换为按网络字节序的整形值。函数成功后返回二进制的网络字节序的IP地址(struct in_add),否则返回INADDR_NONE(-1)。

示例:

#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	struct in_addr addr;

	if(argc != 2)
	{
		fprintf(stderr,"%s <dotted-address>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	if( (addr.s_addr = inet_addr(argv[1])) == -1)
	{
		fprintf(stderr,"%s is Invalid address\n",argv[1]);
	}
	else
	{
		fprintf(stdout,"%u\n",addr.s_addr);
	}
	return 0;
}
注意:如果IP地址为 255.255.255.255 。那么调用 inet_addr() 函数后返回 -1 (因为 -1 的补码形式是 0xFFFFFFFF)。所以不建议使用 inet_addr() 函数。而使用 inet_aton() 函数。

int inet_aton(const char *string, strcut in_addr *addr);

将 string 中存储的点分十进制字符串类型的IP地址转换为二进制的IP地址,转换后的值保存在指针 addr 指向的结构 struct in_addr 中。函数执行成功返回非0值,失败返回0。

示例:

#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2)
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	struct in_addr addr;
	if(inet_aton(argv[1],&addr) != 0)
		fprintf(stdout,"%u\n",addr.s_addr);
	else
		fprintf(stdout,"%s Invalid address\n",argv[1]);

	return 0;
}

char *inet_ntoa(strcut in_addr addr);

将32位的二进制IP地址转换为点分十进制字符串形式。函数执行成功则返回字符串,失败返回NULL。

#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2)
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	struct in_addr addr;
	if(inet_aton(argv[1],&addr) == 0)
	{
		fprintf(stderr,"%s Invalid address\n",argv[1]);
		exit(EXIT_FAILURE);
	}
	printf("%s\n",inet_ntoa(addr));

	return 0;
}

in_addr_t inet_network(const char *str);

将参数 str 执行的字符串形式的网络地址转换为主机字节序的二进制IP地址(无视大小端)。执行成功返回转换后的结果,失败返回-1。

示例:

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2 )
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	struct in_addr addr;

	if ((addr.s_addr = inet_network(argv[1])) == -1)
	{
		fprintf(stderr,"%s Invalid address\n",argv[1]);
		exit(EXIT_FAILURE);
	}
	else
	{
		fprintf(stdout,"%u \n",addr.s_addr);
	}
	return 0;
}

in_addr_t inet_lnaof(struct in_addr addr);

从参数 addr 中提取主机地址,执行成功返回主机字节序形式的主机地址。

如: 192.168.1.1 属于C类地址,则主机地址为 1 。

示例:

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2 )
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	struct in_addr addr;

	if ((addr.s_addr = inet_network(argv[1])) == -1)
	{
		fprintf(stderr,"%s Invalid address\n",argv[1]);
		exit(EXIT_FAILURE);
	}

	addr.s_addr = htonl(addr.s_addr);
	fprintf(stdout,"0x%x \n",inet_lnaof(addr));

	return 0;
}

in_addr_t inet_netof(struct in_addr addr);

从参数 addr 中提取网络地址,执行成功返回主机字节序形式的网络地址。

如: 192.168.1.1 属于 C 类地址,则网络地址为 0x c0a801。

示例:

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2 )
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	struct in_addr addr;

	if ((addr.s_addr = inet_network(argv[1])) == -1)
	{
		fprintf(stderr,"%s Invalid address\n",argv[1]);
		exit(EXIT_FAILURE);
	}
	printf("0x%x\n",addr.s_addr);
	addr.s_addr = htonl(addr.s_addr);
	fprintf(stdout,"0x%x \n",inet_netof(addr));
	return 0;
}

struct in_addr inet_makeaddr(int net, int host);

将主机字节序的网络地址 net 和 主机地址 host 合并成一个网络字节序的IP地址。

示例:

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	if( argc != 2 )
	{
		fprintf(stderr,"%s <dotted-address>\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	struct in_addr addr, addr_1;

	if ((addr.s_addr = inet_network(argv[1])) == -1)
	{
		fprintf(stderr,"%s Invalid address\n",argv[1]);
		exit(EXIT_FAILURE);
	}
	addr.s_addr = htonl(addr.s_addr);
	uint32_t net = inet_netof(addr);
	uint32_t host = inet_lnaof(addr);

	addr_1 = inet_makeaddr(net,host);

	printf("0x%x \n",htonl(addr_1.s_addr));

	return 0;
}

时间: 2024-08-08 12:27:56

Linux 网络之IP转换的相关文章

Linux 网络编程——IP 数据包格式详解

IP 数据报首部 TCP/IP 协议定义了一个在因特网上传输的包,称为 IP 数据报 (IP Datagram).这是一个与硬件无关的虚拟包,由首部和数据两部分组成. 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的.在首部的固定部分的后面是一些可选字段,其长度是可变的.首都中的源地址和目的地址都是 IP 协议地址. IP 数据报首部的固定部分中的各字段: 1)版本:占4位,指IP协议的版本. 通信双方使用的 IP 协议版本必须一致.日前广泛使用的 IP 协议版本号为 4

Linux网络编程--IP地址与域名解析(DNS)

在日常生活中,人们往往知道主机的域名而不知道主机的IP地址,而socket的API均基于IP地址,所以需要使用DNS域名解析服务器进行解析. 那么首先简单介绍一下DNS的原理,DNS服务器系统是按树形的结构构造,顶级域名服务器下分多个二级域名服务器,二级域名服务器下面又分多个下级域名服务器,每个服务器都下辖了一些主机,如图所示: 那么一个主机是如何查询一个域名的IP地址呢?首先需要想本地的域名服务器查询,如果没有就向上级域名服务查询,如果二级的也查不到就会向顶级域名服务器查询,如果顶级的也查不到

Linux自学笔记——Linux网络基础、命令及属性配置

网络对于Linux来说不可或缺的一部分,本文主要对linux网络的基础知识,常用配置命令以及linux配置文件的属性等等作一个总结. 计算机网络: TCP/IP协议栈: TCP/IP分为4层,分别为应用层,传输层,网络互连层,主机到网络层,不同于OSI,他将OSI中的会话层.表示层规划到应用层,把数据链路层和物理层划分给主机到网络层. OSI,Open System Interconnection,开放式系统互联,国际化标准组织ISO制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描

Linux网络基础番外篇(IP、MAC、TCP)

linux网络管理 计算机网络 MACMAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制.介质访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC地址.因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址.MAC地址(MAC Address)MAC(Medium/Media Access Control)地址,用来表示互联网上每一

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层

linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-12-17 0 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置的方法: 即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 route add default gw 192.168.1.1 //添加网关 启动生效: vim /etc/sysconfig/ne

Linux网络配置之二ip、ss、网络相关配置文件

本文续网络基础与Linux网络配置之一 ifconfig.route.netstat命令详解 ip命令 作用ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户.几乎所有的Linux发行版本都支持该命令. 格式ip [ OPTIONS ] OBJECT { COMMAND | help }   OBJECT := { link | addr | route | netns  } 注:OBJECT可简写,

linux c/c++ IP字符串转换成可比较大小的数字

由www.169it.com搜集整理 IP字符串转换成可比较大小的数字,具体代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "stdio.h" #include "arpa/inet.h" #include using namespace std; // linux c/c++ IP字符串转换成可比较大小的数字 // g++ -o test_ip_unsigned test_ip_unsigned.cpp int 

20150908 Linux运维网络基础和TCP有限状态机状态转换原理、Linux网络属性配置及网络

1.网络的O互联网模型 物理层:电信号.网卡.比特流,迷数据端设备提供传送数据 数据链路层:将源自网络层来的数据传输至相邻目标网络层中.IP报文. 网络层:负责为分组交换机上的不同主机提供通信服务,TCP/IP层    ( 是在Linux内核实现) 传输层:二个主机中进程间的通信提供服务,通过端口的形式(随机端口)是通信源头 应用层:直接为用户的应用提供服务 (在客户应用中实现)例如:http.tomcat OSI 数据传输格式 协议 会话.表示.应用层 报文 HTTP  FTP    SMTP