字节序的深入理解

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{

    sockaddr_in s_sockaddr;
    s_sockaddr.sin_family = AF_INET;
    //字符类型转化为网络序(大端序)
    inet_aton("192.168.1.250",&s_sockaddr.sin_addr);
    printf("s_sockaddr.sin_add = 0x%X\n",s_sockaddr.sin_addr);
    printf("ntohl(s_sockaddr.sin_addr.s_addr) = 0x%X\n",ntohl(s_sockaddr.sin_addr.s_addr));

    //或者
    printf("0x%X\n",inet_addr("192.168.1.250"));
    printf("0x%X\n",ntohl(inet_addr("192.168.1.250")));

    //网络序(大端序)转化为字符类型
    s_sockaddr.sin_addr.s_addr = htonl(0xC0A801FA);
    printf("%s\n",inet_ntoa(s_sockaddr.sin_addr));

    return 0;
}

 总结:

1)inet_aton()、inet_addr()函数是将字符串ip传递给网络(大端序);

inet_aton()是将网络(大端序)转换为字符串ip。

函数最终改变的是,多字节变量在内存中的存储方式。

2)转给网络的是大端序形式,读入前先添加ntohl(),保证以大端的形式写入变量;

3)从网络接收的时大端序形式,读出后添加htonl(),保证以大端的形式显示。

4)ntohl和htonl是一个函数,本质上是判断本机是不是大端序,如不是,则转换字符顺序。

从而,保证了两点:一,变量在内存中的存储是大端序,二,从变量中读取是以大端序形式显示

其实,这个跟写socket报文一样,发送端,写之前调用htonl,保证报文是大端序;

接收端,解析后,调用ntohl,保证解析的是大端序形式。

总而言之,发之前加htonl,收之后也要加ntohl!!!!!!!!!!

总而言之,发之前加htonl,收之后也要加ntohl!!!!!!!!!!

总而言之,发之前加htonl,收之后也要加ntohl!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/modi000/article/details/125166062