版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41572450/article/details/80044499
ipv4套接口地址结构
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port; //2 byte
struct in_addr sin_addr; //4 byte
char sin_zero[8];
};
通用套接口地址结构
struct sockaddr{
uint8_t sin_len;
sa_family_t sin_family;
char sa_data[14];
};
大端字节序
最高有效位放在内存最低地址,最低有效位放在内存最高地址。
小端字节序
最高有效位放在内存最高地址,最低有效位放在内存最低地址。
主机字节序
x86 是小端字节序,ARM字节序可配置
网络字节序
人为规定位大端字节序
uint32_t x = 0x12345678;
uint8_t *p = (uint8_t *)&x;
printf("%0x %0x %0x %0x",p[0],p[1],p[2],p[3]);
字节序转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h 代表host ,n代表network ,s代表short,l代表long
地址转换函数
in_addr_t inet_addr(const char *cp); //1
char *inet_ntoa(struct in_addr in); //2
int inet_aton(const char *cp,struct in_addr *inp);//3
//1 把点分ip转换成网络字节序返回
//2 把网络字节序转换成点分ip
//3 和1一样,但是从inp输出
例:
unsigned long addr = inet_ntoa("192.168.0.100");
printf("addr = %u",ntohl(addr));
struct in_addr ipaddr;
ipaddr.s_addr = addr;
printf("%s",inet_ntoa(ipaddr.s_addr));
套接字类型
流式套接字(SOCK_STREAM) —-TCP
面向连接的、可靠的数据传输,数据无差错、无重复的发送,且按发送顺序接收
数据报式套接字(sock_DGRAM) —-UDP
无连接服务、不提供无错保证、数据可能丢失或重复、且接收顺序混乱