函数功能
socket(): 创建一个网络通信的 endpoint(主动套接字), 绑定协议族.
connect(): 发起 TCP 三次握手
bind(): 套接字绑定本地协议地址
listen(): a. 把套接字设置为被动套接字; b. 告诉内核允许为该套接字排队的最大连接个数.
accept(): 返回已完成连接队列的队头
read(): 读
write(): 写
close(): 套接字描述符的引用计数减 1, 如果引用计数为 0 则发起四次挥手.
知识点
connect() 三种失败场景
超时.
对端主机在指定端口上没有进程等待连接.
目的不可达(路由失败).
close() 与发送队列
调用 close() 之后, 进程不能再使用该描述符. 但是已经发送队列中的数据还是会继续发送, 等到发送回再发起四次挥手.
close() 与 shutdown()
close() 在套接字引用计数为 0 时, 才发起四次挥手.
shutdown() 直接出发四次挥手.
close() 与多进程
父进程 fork 出子进程处理已连接的套接字后, 应该立即调用 close(). 避免父进程描述符耗尽, 且客户连接都没有被珍重终止.
一端调用 close()后, 另一端还在 write()
对端 (假设为 client) 调用 close(), 即向 server 发送了 FIN 报文, 关闭了单向通道. 此时如果 server 没有感知到还在 write, 第一次 write 可以调用成功(返回要发送的字节数). 数据包可以发送到 client 端. 但是对端会返回 RST 报文.
如果再调用 write()(第二次), 则会受到 SIG_PIPE 信号, 导致进程退出. 一般的做法是捕获 SIGPIPE 信号, 或者忽略它.
持续更新中...
来源: https://www.qcloud.com/developer/article/1181047