一、ip字符串与结构体struct sockaddr_in
1、inet_addr
ip字符串转struct sockaddr_in
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr("114.114.114.114");
2、inet_ntoa
struct sockaddr_in转ip字符串
printf("ip = %s\n",inet_ntoa(sock.sin_addr));
二、sockaddr和sockaddr_in
1、struct sockaddr
struct sockaddr {
sa_family_t sin_family; //地址族
char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息
};
2、struct sockaddr_in
struct sockaddr_in {
sa_family_t sin_family;//地址族
uint16_t sin_port;//16位端口
struct in_addr sin_addr;//32位IP地址
char sin_zero[8];//不使用
};
struct in_addr {
In_addr_t s_addr; //32位IPv4地址
};
3、二者直接通过结构体指针强转即可
struct sockaddr s_sockaddr;
struct sockaddr_in s_sockaddr_in;
struct sockaddr_in d_sockaddr_in = *(struct sockaddr_in *)s_sockaddr;
struct sockaddr d_sockaddr = *(struct sockaddr *)s_sockaddr_in;
三、网络字节序和本地字节序
1、本地字节序转网络字节序
uint32_t htonl(uint32_t hostlong);//32位
uint16_t htons(uint16_t hostshort);//16位
2、网络字节序转本地字节序
uint32_t ntohl(uint32_t netlong);//32位
uint16_t ntohs(uint16_t netshort);//16位