网络编程__网络字节序和地址字节序转化

网络字节序是大端序,而内存字节序是小端序(就像汇编学的内容一致)

大端序:高位字节存放到地位地址

小端序:高位字节存放在高位地址

因此在地址传输时需要将地址进行转化

//short

unsigned short htons(unsigned short);//h to n,主机转化成网路数据 s short型

unsigned short ntohs(unsigned short);//n to h,网路转化成主机数据 s short型


//long类似上面l则是long型

unsigned long htonl(unsigned long);

unsigned long ntohl(unsigned long);


#include"iostream"

//4个函数都需要这个头文件和lib库
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;


int main(int argc,char* argv[]){
	
	unsigned short host_port=0x1234;
	unsigned short net_port;
	unsigned long host_addr=0x12345678;
	unsigned long net_addr;
	
	
	net_port=htons(host_port);
	net_addr=htonl(host_addr);
	//cout<<net_port error因为不是10进制,已经明确表明是
	
       %d十进制,%0八进制,%x16进制
	printf("host_port:%#x\n",host_port);//%#x short16进制
	printf("net_port:%#x\n",net_port);
	printf("host_addr:%lx\n",host_addr);//%lx long16进制
	printf("net_addr:%lx\n",net_addr);
	
	return 0;
}




unsigned long   inet_addr(const char* string)

    //是将字符串直接转化成对应的ip地址

    //in_addr_t 一般为 32位的unsigned long.和存放ip地址有关,如192.168.3.144记为0xc0a80390

    //linux中inet_aton()和inet_addr()功能类似,只是在Windows没有

char* inet_ntoa(in_addr_t)

   //功能和上面的相反

#include"iostream"
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;


int main(int argc,char* argv[]){
	
	char* ip="1.2.3.4";
	//in_addr_t addr;error in_addr_t Windows没有
	unsigned long addr;
	addr=inet_addr(ip);
	//cout<<addr<<endl;可以打印出来
	printf("addr:%#lx\n",addr);
	//printf addr:0x4030201 <span style="color:#FF0000;">默认转化成网络地址了</span>
	//server_addr.sin_addr.s_addr=inet_addr(argv[1]);在客户端可以这样用
	
	
	
	//***ip=inet_ntoa(addr);error***
	//char FAR * inet_ntoa(struct in_addr in );
	//struct in_addr{in_addr_t s_addr};
	// 不能将参数 1 从“unsigned long”转换为“in_addr”
	//addr是in_addr_t型而函数参数是in_addr型,故错误
	
	in_addr my_in_addr;
	my_in_addr.s_addr=addr;
	ip=inet_ntoa(my_in_addr);
	cout<<"ip:"<<ip<<endl;
	//printf ip:1.2.3.4<span style="color:#FF0000;"> 转化成本机地址</span>
	
	return 0;
}




你可能感兴趣的:(网络编程__网络字节序和地址字节序转化)