字节序
常见:
大端:Big endian 高字节存储在低地址
小端:Little endian 低序字节存储在低地址
例如存储:0x01020304
内存地址 | 4000 | 4001 | 4002 | 4003 |
大端 | 01 | 02 | 03 | 04 |
小端 | 04 | 03 | 02 | 01 |
网络字节顺序采用大端
字节序转换函数
#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t htonl(uint32_t netlong);
uint16_t htons(uint16_t netshort);
h表示host,n表示network,s表示short,l表示long
Socket地址结构
IPv4套接字地址结构
struct sockaddr_in{
uint8_t sin_len; //整个sockaddr_in结构体的长度
sa_family_t sin_family; //指定地址家族是 IPv4 AF_INET或者别的
in_port_t sin_port; //端口,65535,16位无符号整数
struct in_addr sin_addr; //地址.32位无符号整数
char sin_zero[8]; //暂不使用,一般设置为0
}
通用地址结构
struct sockaddr{
uint8_t sin_len; //整个sockaddr结构体的长度
sa_family_t sin_family; //指定地址家族是 IPv4 AF_INET或者别的
char sa_data[14]; //由sin_family决定它的形式
}
地址转换函数
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp,struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);