#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!!!!!!!!!!