Chapter3 套接字编程简介
![805b0f2898037ec298bc00bfe6b73e4d.png](https://i-blog.csdnimg.cn/blog_migrate/0ce1cf4c304cd10d43b3fdf41f0192c7.jpeg)
套接字地址结构
IPV4
套接字地址结构,也称为”网际套接字地址结构“.struct sockaddr_in
定义在头文件<netinet/in.h>
中,具体如下:
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr; // 32-bit IPV4 addreass
}; // network byte ordered
/* Socket address, internet style. */
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
下面解释下ipv4套接字地址结构中每个字段的意义:
sin_len
,无符号短整数,用来指明套接字地址结构的长度。从这里也可以看出**套接字地址结构长度可变,不同协议族的套接字地址结构长度会不同。
但是,即使有了长度字段,我们也无需去设置和检查它,除非涉及到路由套接字(需要处理来自不同协议族的套接字地址结构)
sin_family
,无符号整数,用来指明套接字地址结构的地址族。 需要主动设置。sin_port
,无符号的16位整数,用来指明TCP或UDP的端口号. 需要主动设置。sin_addr
,上面声明的结构体,用来存放IPV4的32-bit地址. 需要主动设置。sin_zero[8]
,char类型。填充位,用来保证struct sockaddr_in
和struct sockaddr
size一致。
编程时不需要填写。
注意,套接字地址结构只用于在给定主机上使用,虽然结构中的某些字段用于在不同主机之间通信,但结构体本身不能用于在主机之间通信!
通用
引入通用套接字地址结构的意义是,在传参时socket(),bind()等套接字函数
可以处理各种协议类型的套接字地址结构,做到”协议无关性“。
在头文件<sys/socket.h>
中定义了通用套接字地址结构struct sockaddr
,具体如下:
/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family;