在实现网络通信前, 先来了解一下socket
套接字什么时候就绪(可读可写). 第一次学习socket
只需要明白我用红色标记的条件就行.
缓冲区
每个套接字接收区缓存 (用于读) 和发送区缓存 (用于写) :
- 接收区缓存: 接收数据, 从内核缓冲复制到用户应用程序数据缓冲区.
- 发送去缓存: 用户应用程序数据缓冲区复制到内核缓冲区, 等待发送.
每个套接字都有接收缓存区低水位标记(用于读)和发送缓存区低水位标记(用于写):
- 接收低水位: 可读时套接字接收缓冲区中所需的最少数据量. 对于TCP, 其默认值为1.
- 发送低水位: 可写时套接字发送缓冲区中所需的最少可用空间. 对于TCP, 其默认值常为2048.
可以修改接收缓冲区的低水位来保证不用频繁的调用读, 等累计到一定的量在一次性读. 这样就可以减少读的次数. 像libevent
就设置了用户的低水位, 高水位.
socket可读
- 监听socket上有新的连接请求. 因为套接字收到了对方的connect请求, 执行了三次握手的第一步: 对方发送SYN请求过来, 使该方监听套接字处于可读状态; 通常情况下, 对这样的套接字执行accept操作不会阻塞.
- 已连接socket. socket内核接收缓存区中的字节数大于或等于其低水位标记
SO_RCVLOWAT
, 此时可以无阻塞地读该socket, 并且读操作返回的字节数大于0. 对于TCP和UDP套接字而言, 其缺省值为1, 默认情况下, 只要缓冲区中有数据, 那就是可读的