SOCET基础
socet是一种接口,包含ip和端口,类似快递的地址和门牌号
1.htonl函数是一个用于网络编程中的函数,简称Host to Network Long表示将主机字节序转成32位的网络字节序即大端法
2.htons即是host to network short long的缩写,表示将主机字节序转成16位的网络字节序即大端法
3.l 结尾的函数用于ip地址转换,s 结尾的函数用于端口号的转换。
4.大端字节序列:高地址低数据,低字节高数据。
5.小段字节序列:低字节低数据,高字节高数据。
6.网络数据流的地址有这样规定:先发出的数据是低地址,后发出的数据是高地址。
7.TCP / IP协议规定,网络数据流应采用大端字节序,即低地址高字节
#include <arpa/inet.h>
uint32_t htonl (uint32_t hostlong);
uint16_t htons (uint16_t hostshort);
uint32_t ntohl (uint32_t netlong);
uint16_t ntohs (uint16_t netshort);
2. sockaddr数据结构
我们在使用socket中,需要使用结构体sockaddr_in将IP地址和端口号等保存,然后用于绑定socket;
但进行绑定时,我们却要将结构体sockaddr_in强制类型转换为结构体sockaddr,这是为什么呢?
由于历史原因,一开始是没有结构体sockaddr_in,只有结构体sockaddr。
后来为了适配ipv4的到来,将结构体sockaddr细化为结构体sockaddr_in,如上图。
两个结构体如下:
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};