您的位置:首页 > 理论基础 > 计算机网络

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

2016-04-10 22:04 120 查看
网络字节序是大端序,而内存字节序是小端序(就像汇编学的内容一致)

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

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

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: