tcp - TCP recv 实际上做了什么?
问题描述
我很难找到表达我的问题的最佳方式......一旦你建立了一个 TCP 套接字连接并且你正在使用从另一台服务器发送的数据,这其中有什么作用recv
?
我的理解是,一旦建立连接,当远程套接字发送数据时,数据将“出现”在我的客户端的接收缓冲区中 - 它不会等待我通过调用来请求recv
数据,驱动程序在幕后处理这个?
那么这是否意味着recv
(或.Net 中的库实现Socket.Receive
)只是监视本地接收数据缓冲区?似乎不可能,否则它不会知道等待数据和连接丢失的错误状态之间的区别。
如果本地数据已经被缓冲,那么我相信recv
它只是对这个本地数据进行操作,但是当我请求尚未缓冲的数据时它会做什么?
Win32recv
的文档说“recv 函数用于读取传入的数据”,但它似乎没有澄清 - 发送者recv
在从它的发送缓冲区发送数据之前是否等待?还是无论如何我的接收缓冲区都填满了?换句话说recv
:
- 对远程套接字说“请给我一些数据”
- 检查本地缓冲区“我是否已经有一些数据”?
文档还说
如果套接字上没有可用的传入数据,则 recv 调用根据为 WSARecv 定义的阻塞规则阻塞并等待数据到达,除非套接字是非阻塞的,否则不会设置 MSG_PARTIAL 标志。在这种情况下,返回 SOCKET_ERROR 值,错误代码设置为 WSAEWOULDBLOCK。select、WSAAsyncSelect 或 WSAEventSelect 函数可用于确定更多数据何时到达。
这似乎是关键部分,但我只是不明白 - 它等待 dat 到达,但它如何仅通过等待来判断是否有错误?
解决方案
简单回答你的问题:
做recv:
- 对远程套接字说“请给我一些数据”
- 检查本地缓冲区“我是否已经有一些数据”?
它检查本地缓冲区。
当我请求尚未缓冲的数据时它会做什么?
recv 调用阻塞并等待数据到达(或发生错误)。
它等待数据到达,但它如何仅通过等待来判断是否有错误?
它的工作是简单地等待,操作系统的工作是用接收到的字节填充缓冲区,并在数据可用(或发生错误)时通知它。
推荐阅读
- laravel - 我需要什么关系?
- node.js - Node.js 上的微服务与 MicroMQ
- deep-learning - 如何基于姿势参数可视化 SMPL 模型的 3d 关节
- python - Python for 循环中的 MySQL 数据库查询时间慢
- selenium-webdriver - 对于销售团队的轻量级 Web 应用程序来说,现场级断言有多重要?
- c# - 冻结第二个选项卡上的窗格
- python - Python字典没有遍历所有元素
- thymeleaf - Thymeleaf 用服务器端的值替换属性变量
- json - 从 jsonschema 中另一个枚举值键的值派生属性名称
- javascript - 如何从被拒绝的承诺中“抛出”“捕获”方法以由外部“捕获”块处理?