使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理。IP地址其实有三种不同的表示格式,关于这一点,如果你还不知道,亦或对相关的知识还有所迷惑,本文对你将会有很大的帮助。
IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址,IP分组中的IP地址在网络传输中将保持不变。下面具体介绍IP地址的三种不同表示格式。
一、点分10进制表示格式
这是我们最常见的表示格式,比如某机的IP地址可能为“202.101.105.66”。事实上,对于Ipv4(IP版本)来说,IP地址是由一个32位的二进制数所构成,但这样一串数字序列无疑是十分冗长并且难以阅读和记忆的。为了方便人们的记忆和使用,就将这串数字序列分成4组,每组8位,并改为用10进制数进行表示,最后用小原点隔开,于是就演变成了“点分10进制表示格式”。
来看看刚才那个IP地址的具体转化过程:
IP地址:11001010011001010110100101000010
分成4组后:11001010 01100101 01101001 01000010
十进制表示:202 101 105 66
点分表示:202.101.105.66
二、网络字节顺序格式(NBO,Network Byte Order)
下面我们来谈谈网络字节顺序格式,它和我们后面将要介绍的主机字节顺序格式一样,都只在进行网络开发中才会遇到。因此,在下面的介绍中,我假设读者对Socket编程知识有一定的基础。
在网络传输中,TCP/IP协议在保存IP地址这个32位二进制数时,协议规定采用在低位存储地址中包含数据的高位字节的存储顺序,这种顺序格式就被称为网络字节顺序格式。在实际网络传输时,数据按照每32位二进制数为一组进行传输,由于存储顺序的影响,实际的字节传输顺序是由高位字节到低位字节的传输顺序。
为了使通信的双方都能够理解数据分组所携带的源地址、目的地址以及分组的长度等二进制信息,无论是主机还是路由器,在发送每一个分组以前,都必须将二进制信息转换为TCP/IP标准的网络字节顺序格式。网络字节顺序格式的地址不受主机、路由器类型的影响,它的表示是唯一的。
在Socket编程开发中,通过函数inet_addr和inet_ntoa可以实现点分字符串与网络字节顺序格式IP地址之间的转换。
inet_addr函数原型如下:
unsigned long inet_addr(const char FAR * cp)
函数中的参数cp指向网络中标准的点分地址字符串,其中每个以点分开的数字不可以大于255,这些数字可以是十进制、八进制、十六进制或者混合使用。如“10.23.2.3”、“012.003.002.024”、“0xa.0x3.0x14.0x2”、“10.003.2.0x12”。
下面举一个函数小例子,该函数可以用来测试一目标主机的某端口是否开放,这是端口扫描技术的基础。
BOOL ScanPort(char * m_IP,u_short m_port)
{
struct sockaddr_in m_SqlAddress; //server's address.
SOCKET m_socket;
int ret;
memset((char *)&m_SqlAddress,0,sizeof(m_SqlAddress));
m_SqlAddress.sin_port = htons(m_port);
m_SqlAddress.sin_addr.s_addr = inet_addr(m_IP);
m_SqlAddress.sin_family = AF_INET;
m_socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //Create TCP Connect.
if(m_socket < 0)
return FALSE;
ret = connect(m_socket,(struct sockaddr *)&m_SqlAddress,sizeof(m_SqlAddress));
return(ret);
}
三、主机字节顺序格式(HBO,Host Byte Order)
主机字节顺序格式顾名思义,其IP地址的格式是和具体主机或者路由器相关的。对于不同的主机,在进行IP地址的存储时有不同的格式,比如对于Motorola 68k系列主机,其HBO与NBO是相同的。而对于Intel x86系列,HBO与NBO则正好相反。
在Socket编程中,有四个函数来完成主机字节顺序格式和网络字节顺序格式之间的转换,它们是:htonl、htons、ntohl、和ntohs。htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。
在实际应用中我们常见到将端口号转换的例子(如上例)。这是因为,如果用户输入一个数字,而且将指定使用这一数字作为端口号,应用程序则必须在使用它建立地址以前,把它从主机字节顺序转换成网络字节顺序(使用htons()函数),以遵守TCP/IP协议规定的存储标准。相应地,如果应用程序希望显示包含于某一地址中的端口号(例如从getpeername()函数中返回的),这一端口号就必须在被显示前从网络顺序转换到主机顺序(使用ntohs()函数)。
那么,对于IP地址,主机字节顺序格式的转换又有哪些应用呢?
应用一,如果想知道从202.156.2.23到202.156.9.65这两个IP之间到底有多少个主机地址怎么办?这时就可以将两个IP地址转换为主机字节顺序的格式然后相减来得到,具体的实现如下:
int GetIPCount(char * ip1,char * ip2)
{
long pp;
long ss;
pp = ntohl(inet_addr(ip1));
ss = ntohl(inet_addr(ip2));
return(ss - pp + 1);
}
应用二,如果对一个网段进行扫描,比如,当前正在扫描202.156.23.255,怎么让程序知道下一个应扫的IP是202.156.24.0?这时可以将当前IP转换成主机字节顺序格式并加1后,在转换回网络格式即可,具体实现如下:
char * GetNextIp(char * m_curip)
{
struct sockaddr_in in;
long pp;
char * re;
pp = ntohl(inet_addr(m_curip));
pp = pp + 1;
in.sin_addr.s_addr = htonl(pp);
re = inet_ntoa(in.sin_addr);
return (re);
}
总结
本文介绍了IP地址的三种不同表示格式,包括各种格式产生的原因、具体含义以及在Socket编程开发中的一些应用。在实际应用中,必须遵循应用时所应采用的格式标准,同时还应灵活运用格式间的相互转换以及计算技巧。通过对本文的阅读,希望可以给读者在以后的学习和工作开发带来启发。
分享到:
相关推荐
通过上述分析和代码示例,我们可以看到如何在Android应用程序中使用正则表达式来验证IP地址的有效性。这种方法不仅简单易懂,而且非常实用。在实际开发中,还可以根据具体需求进一步扩展和优化正则表达式的实现。
在IT行业中,IP地址范围判断是一项常见的任务,特别是在网络管理和数据分析领域。这个任务涉及到使用IP地址数据库查询库,以及在MySQL数据库中进行高效的数据操作。以下是对这些知识点的详细解释: 1. **IP地址**:...
IP地址库作为一种重要的地理定位工具,在互联网行业中发挥着不可替代的作用。通过对上述知识点的学习和理解,我们可以更好地利用IP地址库来提升业务的安全性和用户体验。同时,需要注意的是,随着技术的发展和网络...
综上所述,这个"C#自制IP地址控件"是一个实用的开发资源,它简化了IP地址在Windows应用程序中的使用和处理。开发者可以利用它的`Value`和`Address`属性,以及附带的Demo,快速集成到自己的项目中,提高开发效率和...
总的来说,这个压缩包提供了一套在PowerBuilder环境中获取网络信息的解决方案,包括IP地址、MAC地址和DNS服务器信息,这在进行网络相关的应用程序开发时非常有用。使用这些源码,开发者可以更好地集成网络功能,实现...
"IP地址输入框控件"是一种常见的用户界面元素,特别是在VB(Visual Basic)应用程序中,它允许用户输入IPv4或IPv6地址。这个控件的设计和功能类似于网络连接设置中用于输入IP地址的文本框。 首先,我们要理解什么是...
在应用开发中,我们可能需要验证IP地址的有效性、转换IP地址的表示形式(如从字符串到二进制),或者进行IP地址的路由和子网划分等操作。 总的来说,在PowerBuilder中获取网卡号和IP地址涉及到对Win32 API的熟练...
MySQL最新IP地址库是用于网络服务中识别和管理网络连接的重要资源,特别是对于需要进行IP定位、网络管理和安全控制的应用程序。这个IP地址库包含了全国乃至全球范围内的IP地址信息,确保了数据的广泛覆盖和准确性。...
在IT领域,尤其是在网络编程中,获取本机的IP地址是一项基本操作。"易语言取本机所有IP地址"是一个针对易语言(EasyLanguage)编程环境的特定功能,旨在帮助开发者获取计算机上所有网络接口的IP地址信息。下面将详细...
在IT行业中,网络通信是至关重要的,而IP地址作为网络通信的基础,其管理扮演着...在实际开发过程中,还需要结合具体的业务需求和性能要求,灵活运用各种技术和工具,以打造出高效、稳定且易于维护的IP地址管理系统。
在IT领域,网络通信是不可或缺的一部分,而IP地址则是网络通信中的关键标识。本文将深入探讨如何使用百度来查询IP地址,以及与之相关的技术知识。 首先,IP地址(Internet Protocol Address)是互联网上的每台设备...
在网页、软件应用或操作系统中,IP地址输入框是一个必不可少的部分,它确保用户输入的IP地址格式正确,以便进行有效的网络通信。 IP地址分为IPv4和IPv6两种主要类型。IPv4是最广泛使用的版本,由32位二进制数表示,...
总之,这个“IP地址分析工具VB源码”为学习网络管理和VB编程提供了实践案例,可以帮助开发者深入理解IP地址和子网划分的概念,并提升其在实际项目中的应用能力。通过研究和修改源码,我们可以进一步定制工具,满足...
在VB(Visual Basic)编程环境中,获取局域网内的IP地址是一项常见的任务,尤其是在网络编程或者需要进行设备间通信的应用中。本项目提供了一种方法,通过VB代码来获取局域网内任一电脑的IP地址,包括服务器的IP。...
标题中的“IP地址计算器源代码 Visual Basic”表明这是一个使用Visual Basic编程语言开发的软件应用,其主要功能是处理和计算IP地址。IP地址是互联网上设备的唯一标识,由32位二进制数表示,通常以4个十进制数的形式...
在IT行业中,JavaScript(简称JS)是一种广泛应用于前端开发、后端开发以及各种网络应用的编程语言。在标题和描述中提到的“非常强悍的JS实现IP地址分配”是指使用JavaScript来处理和管理网络中的IP地址分配问题。IP...
在IT行业中,网络通信是不可或缺的一部分,而IP地址则是网络通信中的关键标识。本文将深入探讨如何通过IP地址查询详细信息,以及在这个过程中涉及到的技术和工具。我们将主要以Visual Studio 2010(VS2010)作为开发...
本资源主要讲解如何使用C#动态获取局域网中所有在线的IP地址,这对于构建网络监控、设备管理或者多点通信的应用非常有用。 首先,我们需要理解局域网的工作原理。局域网是由多台设备通过以太网或无线网络连接形成的...
IP地址控件(CIPAddressCtrl)是Windows API提供的一种特殊控件,用于在GUI应用中展示和编辑IPv4地址。这个控件通常在对话框或窗体中使用,可以方便地处理网络设备的配置。下面我们将深入探讨如何在MFC中集成和操作...
在数据分析中,纯真IP地址库可以帮助分析用户行为的地域分布,这对于市场研究、产品优化和业务决策具有很大价值。例如,电商平台可以根据用户的IP地址判断其所在区域,从而调整物流策略,提高配送效率。 同时,这个...