socket结构体转换

一、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位