40. socket 就绪条件

本文详细介绍了TCP套接字在什么条件下可读可写,包括缓冲区的运作机制、接收与发送低水位标记,以及在不同情况下的读写状态。重点讨论了监听socket的新连接请求、已连接socket的数据读取、通信对端关闭、错误处理等场景,同时也提到了非阻塞connect的就绪条件。了解这些内容对于优化网络通信和错误处理至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在实现网络通信前, 先来了解一下socket套接字什么时候就绪(可读可写). 第一次学习socket只需要明白我用红色标记的条件就行.


缓冲区

每个套接字接收区缓存 (用于读) 和发送区缓存 (用于写) :

  • 接收区缓存: 接收数据, 从内核缓冲复制到用户应用程序数据缓冲区.
  • 发送去缓存: 用户应用程序数据缓冲区复制到内核缓冲区, 等待发送.

每个套接字都有接收缓存区低水位标记(用于读)和发送缓存区低水位标记(用于写):

  • 接收低水位: 可读时套接字接收缓冲区中所需的最少数据量. 对于TCP, 其默认值为1.
  • 发送低水位: 可写时套接字发送缓冲区中所需的最少可用空间. 对于TCP, 其默认值常为2048.

可以修改接收缓冲区的低水位来保证不用频繁的调用读, 等累计到一定的量在一次性读. 这样就可以减少读的次数. 像libevent就设置了用户的低水位, 高水位.


socket可读

  1. 监听socket上有新的连接请求. 因为套接字收到了对方的connect请求, 执行了三次握手的第一步: 对方发送SYN请求过来, 使该方监听套接字处于可读状态; 通常情况下, 对这样的套接字执行accept操作不会阻塞.
  2. 已连接socket. socket内核接收缓存区中的字节数大于或等于其低水位标记SO_RCVLOWAT, 此时可以无阻塞地读该socket, 并且读操作返回的字节数大于0. 对于TCP和UDP套接字而言, 其缺省值为1, 默认情况下, 只要缓冲区中有数据, 那就是可读的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值