IP 地址转换 inet_addr() inet_ntoa() 笔记

inet_addr()   inet_ntoa() 及其自实现函数self_inet_ntoa() 和 self_inet_addr() 笔记

#include <WINSOCK2.h>
#include <iostream>
#pragma comment(lib,"WS2_32.LIB")
using namespace std;

char *self_inet_ntoa(UINT in);
ULONG self_inet_addr(const char *str);

int main()
{
	char *a1,*a2;
	struct sockaddr_in ina1,ina2;
	ina1.sin_addr.s_addr = inet_addr("192.168.1.1");//192+168*256+256*256+256*256*256 = 16885952
	//ina1.sin_addr.s_addr = inet_addr("255.255.255.255");
	ina2.sin_addr.s_addr = inet_addr("192.168.1.2");

	cout <<"self_inet_ntoa:" << endl << self_inet_ntoa(ina1.sin_addr.s_addr) << endl;//[IP] unsigned long --> char *

	a1 = inet_ntoa(ina1.sin_addr);
	cout << "self_inet_addr:" << endl << self_inet_addr(a1) << endl;//[IP] char * -->unsigned long

	a2 = inet_ntoa(ina2.sin_addr);

	cout << a1 << endl;
	cout << a2 << endl;

	return 0;
}

char *self_inet_ntoa(UINT in) //unsigned long --> char *
{ //内存字节存放顺序 192 168 1 1  小端模式下代表的整数就是 1,1,168,192 --> 192+168*256+256*256+256*256*256 = 16885952
	char *output=new char[16];
	cout << in << endl;
	u_char *p=(u_char *)&in;
	for(int i = 0;i<4;i++)
		cout << "p[" << i << "]: " << (UINT)p[i] << endl;
	sprintf(output, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);//--------------------
	return output;
} 

ULONG self_inet_addr(const char *str)//char * -->unsigned long
{//此处忽略对不合法输入的检查
	long a, b, c, d;
	ULONG addr = 0;
	sscanf(str, "%ld.%ld.%ld.%ld", &a, &b, &c, &d);//---------------------
	//网络字节顺序:a b c d, 内存字节存放顺序: a b c d, 对应的自然顺序的整数为 d c b a
	addr |= d<<24;
	addr |= c<<16;
	addr |= b<<8;
	addr |= a;
	return addr;
}

/*
Note0:
inet_ntoa()   struct in_addr型转化为字符串 (需要及时使用strcpy()函数将结果存放到自己的另外一个字符串中)
inet_addr()    字符串转换为长整型----(返回的已经是网络字节顺序)

-------------------------------------------------------------------------------------------------------------------------

Note1:
int main(int argc, char *argv[])
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
//  -----printf()的本质是函数  在同一个函数里后面的变量得到的调用innet_ntoa()函数的返回值会覆盖前面一次的变量得到的调用innet_nota()函数的返回值
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
实际运行结果如下:
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa(addr2)先于inet_ntoa(addr1)执行。
192.168.0.74
211.100.21.179
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。
第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已

-------------------------------------------------------------------------------------------------------------------------
Note2:
sprintf()把格式化的数据写入某个字符串中。
int main(){
	charbuffer[50];//“字符”类型的数组,下面共有50个元素。
	int n,a=5,b=3;//三个变量都为“整数”类型,intn中间要有空格
	n=sprintf(buffer,"%dplus%dis%d",a,b,a+b);//赋予数值
	printf("[%s]isastring%dcharslong\n",buffer,n);/*“格式输出”
	return0;/*“返回零” 也就是程序正常退出}
}
输出结果:
[5 plus 3 is 8] is a string 13 chars long

-------------------------------------------------------------------------------------------------------------------------
Note3:
sscanf() - 从一个字符串中读进与指定格式相符的数据。

-------------------------------------------------------------------------------------------------------------------------
Note4:
inet_addr函数的实现
输入是点分的IP地址格式(如A.B.C.D)的字符串,从该字符串中提取出每一部分,转换为ULONG,假设得到4个ULONG型的A,B,C,D,
ulAddress(ULONG型)是转换后的结果,
ulAddress = D<<24 + C<<16 + B<<8 + A(网络字节序),即inet_addr(const char *)的返回结果
另外,我们也可以得到把该IP转换为主机序的结果,转换方法一样
A<<24 + B<<16 + C<<8 + D           [better]

*/

运行结果:

IP 地址转换 inet_addr() inet_ntoa() 笔记

时间: 2024-08-01 10:42:01

IP 地址转换 inet_addr() inet_ntoa() 笔记的相关文章

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

(四十七)socket编程——socket引入、网络字节序、IP地址转换函数、sockaddr数据结构介绍

一.什么是socket socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,为TCP/

IP地址转换函数

这些天一直在看<UNP>,觉得有必要对一些东西做一下总结(其实只是抄一抄书),加深一下印象. IP地址转换函数有两组,它们可以在字符串和网络字节序的二进制值之间转换IP地址 适用于IPv4地址的函数 1 #include <arpa/inet.h> 2 3 /* Convert Internet host address from numbers-and-dots notation in CP 4 into binary data and store the result in t

python整数与IP地址转换 [转]

我们有时会将一个整数与IP地址进行互换,用python代码实现很简单将一个整数如2000000,变为一个IP地址的方式 >>> import socket >>> import struct >>> int_ip = 123456789 >>> ip = socket.inet_ntoa(struct.pack('I',socket.htonl(int_ip))) #int to ip address '7.91.205.21' &g

字符串-06. IP地址转换

1 /* 2 * Main.c 3 * D6-字符串-06. IP地址转换 4 * Created on: 2014年8月19日 5 *******测试通过******** 6 *转载:http://blog.csdn.net/junjieguo/article/details/7392539 7 */ 8 9 10 #include <stdio.h> 11 12 int bin_dec(int x, int n) //自定义函数将二进制数转换为10进制 13 { 14 if(n == 0)

字符串-06. IP地址转换(20)

一个IP地址是用四个字节(每个字节8个位)的二进制码组成.请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出. 输入格式: 输入在一行中给出32位二进制字符串. 输出格式: 在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用"."分隔开. 输入样例: 11001100100101000001010101110010 输出样例: 204.148.21.114 import java.math.BigInteger; import

IP地址转换成Long型数字的算法

在应用程序开发中,涉及到IP地址的存储,大部分开发人员都将其存为String(或文本类型).能否将固定格式为m.n.x.y的IP地址转换成 Long型的数字呢?答案是肯定的.在数据库层面,可以直接将结果设置成表的主键,避免IP地址的重复,因为是主键,也就是表的索引了,数据库查找时会更 快. 对于格式为m.n.x.y的IP地址,转换成Long型数字的算法如下: view plain   copy Long  =  * 256 * 256 * m + y 使用Java语言,则这样实现: view p

四、IP地址转换

IP地址与端口 TCP/IP(传输控制协议/网际协议)不是一个协议,而是一组协议的总称,包括IP.TCP.UDP.ICMP.ARP等.它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据交换格式以及传送方式. IP地址:是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围内惟一的标识符. 一个IP地址主要由两部分组成:网络地址和主机地址. 网络地址由因特网权力机构分配,主机地址由各个网络的管理员统一分配. IP地址编制方案有两种:IPV4和IPV6 IPV4:二进制表示共3

F5 cookie值与IP地址(二):将IP地址转换成F5 cookie值

简  介 在上一篇中,我们介绍了如何将cookie码转换成IP地址,这次我们将介绍如何将IP地址转换成cookie码.如何上一篇分析清楚了,本篇也很简单. 链接:http://showing.blog.51cto.com/11976328/1841564 转换步骤 下面,我们将以IP地址:192.168.1.1为例: 192.168.1.1->倒置顺序->1 1 168 192->分别转换为16进制->1 1 A8 C0->不够两位的补0->01 01 A8 C0-&g