【发布时间】:2020-10-12 05:29:20
【问题描述】:
我很难找到表达我的问题的最佳方式...一旦您建立了 TCP 套接字连接并且您正在使用从另一台服务器发送的数据,recv 在其中扮演什么角色?
我的理解是,一旦建立连接,当远程套接字发送数据时,数据将“出现”在我的客户端的接收缓冲区中 - 它不会等待我通过 询问调用recv,驱动程序在幕后处理?
这是否意味着recv(或.Net 中的库实现,例如Socket.Receive)只是监控本地接收数据缓冲区?似乎不可能,否则它不会知道等待数据和连接丢失的错误状态之间的区别。
如果本地数据已经被缓冲,那么我相信recv 确实只是对这个本地数据进行操作,但是当我请求尚未缓冲的数据时它会做什么?
docs for Win32 recv say“recv 函数用于读取传入数据”,但它似乎没有澄清 - 发件人在从其发送缓冲区发送数据之前是否等待 recv?还是无论如何我的接收缓冲区都填满了?
换句话说,recv:
- 对远程套接字说“请给我发送一些数据”
- 检查本地缓冲区“我是否已经有一些数据”?
文档也说
如果套接字上没有可用的传入数据,recv 调用会阻塞 并根据定义的阻塞规则等待数据到达 对于没有设置 MSG_PARTIAL 标志的 WSARecv,除非套接字是 非阻塞。在这种情况下,返回 SOCKET_ERROR 的值 错误代码设置为 WSAEWOULDBLOCK。选择、WSAAsyncSelect 或 WSAEventSelect 函数可用于确定何时有更多数据 到了。
这似乎是关键部分,但我只是不明白它 - 它等待 dat 到达,但它如何仅通过等待来判断是否有错误?
【问题讨论】:
-
让我知道我是否可以更好地重新措辞 - 很明显我正在努力解释清楚,因为我不明白我在问什么,我想。
-
@MaximEgorushkin 所以它说“recv 函数用于读取传入数据”,但它似乎没有澄清 - 发送者在从它的发送缓冲区发送数据之前是否等待
recv?还是无论如何我的接收缓冲区都填满了? -
我做到了。我没有找到我的问题的答案。如果你知道答案,请分享!我引用的那行不是第一句话...
标签: tcp