网络编程__网络字节序和地址字节序转化
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);
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)
//功能和上面的相反
大端序:高位字节存放到地位地址
小端序:高位字节存放在高位地址
因此在地址传输时需要将地址进行转化
//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; }
相关文章推荐
- 遗传算法优化BP神经网络续
- 脉冲耦合神经网络
- 人工神经网络
- tcp长连接判断对方断开的方法
- 20159302《网络攻击与防范》第六周学习总结
- 简析TCP的三次握手与四次分手
- Google开源 Volley 网络框架使用
- HttpClient 4.3 使用
- UBUNTU 修改网卡名称 更改设备网卡名称 修改ENO16777736为ETH0 UBUNTU 15.10网卡名称为ENO16777736(http://www.cnphp6.com/archiv)
- TCP拥塞控制
- 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列
- “Wishare杯”南邮第八届大学生程序设计竞赛之网络预赛 题解报告
- 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥
- TCP三次握手四次断开
- 《网络攻防技术与实践》第六周学习总结
- 网络基本功系列:细说交换机
- HTTP协议响应头Date与Age的区别
- TCP窗口控制的作用
- HTTP状态码
- 网络编程__第一个服务端和客户端