TCP / IP 与 OSI 模型的对照参考图

服务端的 Socket 初始化

服务端要提供服务, 要经过这么几个过程. 创建Socket → 绑定地址端口 → 监听端口.

创建Socket

创建Socket 使用的函数如下,

int socket(int domain, int type, int protocol)

domain 就是指 PF_INET、PF_INET6 以及 PF_LOCAL 等,表示什么样的套接字。

type 可用的值是:

参数 protocol 原本是用来指定通信协议的,但现在基本废弃。因为协议已经通过前面两个参数指定完成。protocol 目前一般写成 0 即可。

绑定地址

创建出来的套接字如果需要被别人使用,就需要调用 bind 函数把Socket和Socket地址绑定. 调用 bind 函数的方式如下:

bind(int fd, sockaddr * addr, socklen_t len)

我们需要注意到 bind 函数后面的第二个参数是通用地址格式sockaddr * addr。这里有一个地方值得注意,那就是虽然接收的是通用地址格式,实际上传入的参数可能是 IPv4、IPv6 或者本地套接字格式。bind 函数会根据 len 字段判断传入的参数 addr 该怎么解析,len 字段表示的就是传入的地址长度,它是一个可变值。

这里其实可以把 bind 函数理解成这样:

bind(int fd, void * addr, socklen_t len)