网络字节序是大端序,而内存字节序是小端序(就像汇编学的内容一致)
大端序:高位字节存放到地位地址
小端序:高位字节存放在高位地址
因此在地址传输时需要将地址进行转化
//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; }