【问题标题】:What does TCP recv actually DO?TCP recv 实际上做了什么?
【发布时间】:2020-10-12 05:29:20
【问题描述】:

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

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

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

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

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

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

文档也说

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

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

【问题讨论】:

  • 让我知道我是否可以更好地重新措辞 - 很明显我正在努力解释清楚,因为我不明白我在问什么,我想。
  • @MaximEgorushkin 所以它说“recv 函数用于读取传入数据”,但它似乎没有澄清 - 发送者在从它的发送缓冲区发送数据之前是否等待recv?还是无论如何我的接收缓冲区都填满了?
  • 我做到了。我没有找到我的问题的答案。如果你知道答案,请分享!我引用的那行不是第一句话...

标签: tcp


【解决方案1】:

简单回答您的问题:


是否接收:

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

它检查一个本地缓冲区。


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

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


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

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

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多