C# Windows(最好是C)-如何发现我们没有从socket快速启动中读取数据

C# Windows(最好是C)-如何发现我们没有从socket快速启动中读取数据,c#,sockets,tcp,flow-control,network-monitoring,C#,Sockets,Tcp,Flow Control,Network Monitoring,如果我从套接字读取数据的速度不够快,TCP协议将减小滑动窗口的大小,发送方可能在发送过程中被阻塞(如本文所述) 我如何在Windows上的接收器端检测到这种情况?最好直接在C#代码中检测,并且不影响从套接字读取的性能?其他监控解决方案(perfmon、wireshark)也可以接受,但对我的场景来说远不是最理想的 具体情况是什么?假设服务器应用程序可以以高达1Mbps的速度传输数据,但是我的客户端应用程序只能以0.5Mbps的速度接收数据。如何在客户端应用程序中发现TCP流控制正在启动并降低传输

如果我从套接字读取数据的速度不够快,TCP协议将减小滑动窗口的大小,发送方可能在发送过程中被阻塞(如本文所述)

我如何在Windows上的接收器端检测到这种情况?最好直接在C#代码中检测,并且不影响从套接字读取的性能?其他监控解决方案(perfmon、wireshark)也可以接受,但对我的场景来说远不是最理想的

具体情况是什么?假设服务器应用程序可以以高达1Mbps的速度传输数据,但是我的客户端应用程序只能以0.5Mbps的速度接收数据。如何在客户端应用程序中发现TCP流控制正在启动并降低传输速度


我访问了Socket.Available属性,想知道这是否是查询此信息的推荐方式?

TCP窗口由内核处理,您将无法使用。我想您可以将ReceiveBufferSize与接收的字节数进行比较。如果缓冲区未满,则您正在等待。

您最好尽可能快地阅读,而不是浪费时间让系统告诉您阅读速度不够快,这只会进一步降低您的阅读速度。如果您正在以最大速度阅读,而发送方仍被阻止,则TCP工作正常,对此您无能为力,只能寻找一台速度更快的机器。

为了优化,有许多选项可供选择-优化代码,优化业务逻辑(丢弃一些消息,无需进一步处理)或者,正如你提到的,优化硬件。问题是-如何发现甚至需要一些优化?当然没有服务器应用的访问权..@user2308106我不理解你评论的要点。我的答案似乎很清楚。构建更多的代码以发现阅读速度过慢是错误的方法。如果病情恶化,你会怎么办?读得快一点。那为什么不一直这么做呢?你的问题和这条评论真的没有多大意义。@user2308106重点是TCP是用来处理传输控制的,所以你不必这么做。@EJP我理解你的观点-从技术角度看,这是正确的。然而,每个项目的时间和预算是有限的,我们需要在投资优化(过早优化…-你知道这个)之前确定优先级。把这看作是内存或CPU使用的优化——在优化代码之前,您也总是先进行测量。到目前为止,总有办法优化(在这种特殊情况下,我们可以重写我们正在使用的第三方消息传递库,但如果没有确切数字,没有人会批准这一成本)最佳答案。不幸的是,我目前将套接字包装到NetworkStream(并将其包装到SslStream)中,并使用BeginRead-EndRead函数从中读取;所以你的解决方案需要重新架构。。。因此,如果有任何其他建议,我将欢迎他们。