首页 > 解决方案 > TCP recv 实际上做了什么?

问题描述

我很难找到表达我的问题的最佳方式......一旦你建立了一个 TCP 套接字连接并且你正在使用从另一台服务器发送的数据,这其中有什么作用recv

我的理解是,一旦建立连接,当远程套接字发送数据时,数据将“出现”在我的客户端的接收缓冲区中 - 它不会等待我通过调用来请求recv数据,驱动程序在幕后处理这个?

那么这是否意味着recv(或.Net 中的库实现Socket.Receive)只是监视本地接收数据缓冲区?似乎不可能,否则它不会知道等待数据和连接丢失的错误状态之间的区别。

如果本地数据已经被缓冲,那么我相信recv它只是对这个本地数据进行操作,但是当我请求尚未缓冲的数据时它会做什么?

Win32recv的文档“recv 函数用于读取传入的数据”,但它似乎没有澄清 - 发送者recv在从它的发送缓冲区发送数据之前是否等待?还是无论如何我的接收缓冲区都填满了?换句话说recv

  1. 对远程套接字说“请给我一些数据”
  2. 检查本地缓冲区“我是否已经有一些数据”?

文档还说

如果套接字上没有可用的传入数据,则 recv 调用根据为 WSARecv 定义的阻塞规则阻塞并等待数据到达,除非套接字是非阻塞的,否则不会设置 MSG_PARTIAL 标志。在这种情况下,返回 SOCKET_ERROR 值,错误代码设置为 WSAEWOULDBLOCK。select、WSAAsyncSelect 或 WSAEventSelect 函数可用于确定更多数据何时到达。

这似乎是关键部分,但我只是不明白 - 它等待 dat 到达,但它如何仅通过等待来判断是否有错误?

标签: tcp

解决方案


简单回答你的问题:


做recv:

  1. 对远程套接字说“请给我一些数据”
  2. 检查本地缓冲区“我是否已经有一些数据”?

它检查本地缓冲区。


当我请求尚未缓冲的数据时它会做什么?

recv 调用阻塞并等待数据到达(或发生错误)。


它等待数据到达,但它如何仅通过等待来判断是否有错误?

它的工作是简单地等待,操作系统的工作是用接收到的字节填充缓冲区,并在数据可用(或发生错误)时通知它。


推荐阅读