C++ SOCET基础

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 */
};
end