
书: https://pan.baidu.com/s/1LWWovU7IScpiddLrDhjl1w?pwd=pc5n
笔记如下:
- 套接字(Socket)基础:TCP/IP网络编程的核心是套接字,分为流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。
- TCP服务器流程:
socket()
创建套接字bind()
绑定IP和端口listen()
进入监听状态accept()
接受客户端连接read()
/write()
通信close()
关闭连接
- TCP客户端流程:
socket()
创建套接字connect()
连接服务器read()
/write()
通信close()
关闭连接
- UDP通信:无连接协议,使用
sendto()
和recvfrom()
直接收发数据。 - 地址处理函数:
inet_addr()
将点分十进制IP转换为32位整数inet_ntoa()
将网络字节序IP转换为字符串htons()
/ntohs()
主机与网络字节序转换
- 多进程服务器:通过
fork()
创建子进程处理多个客户端连接。 - 进程间通信:使用管道(pipe)、消息队列等实现父子进程同步。
- I/O多路复用:
select()
监控多个文件描述符poll()
改进的select
epoll()
Linux高性能I/O复用机制
- 信号处理:
SIGCHLD
回收子进程SIGPIPE
处理断开的管道
- 套接字选项:
SO_REUSEADDR
允许重用本地地址SO_KEEPALIVE
保持连接活性
- 超时设置:通过
setsockopt()
设置SO_RCVTIMEO
和SO_SNDTIMEO
。 - 广播(Broadcast):UDP特有的
SO_BROADCAST
选项实现局域网广播。 - 多播(Multicast):使用
IP_ADD_MEMBERSHIP
加入多播组实现一对多通信。 - 线程安全:多线程服务器中需使用互斥锁(mutex)保护共享资源。
- HTTP服务器实现:解析HTTP请求报文(GET/POST),构造响应报文(状态行+头部+正文)。
- 域名解析:
gethostbyname()
和getaddrinfo()
实现域名到IP的转换。 - 非阻塞I/O:通过
fcntl()
设置O_NONBLOCK
标志实现非阻塞套接字。 - 心跳机制:定时发送心跳包检测TCP连接活性。
- 协议设计:自定义应用层协议时需考虑报文格式(长度+内容)、序列化等。
- 性能优化:
- 减少数据拷贝(零拷贝技术)
- 连接池管理
- 批量数据传输