gpt4 book ai didi

windows - WIndows 7 上的高频数据监听器 TCP 过载

转载 作者:可可西里 更新时间:2023-11-01 02:45:00 25 4
gpt4 key购买 nike

我编写了一个基于 C# 的监听器来从股票市场服务器检索数据。问题是,通过 WireShark 监控后,TCP 窗口变满,这意味着接收主机(我)无法足够快地处理传入数据。

我知道我的数据提供者已经从他这边禁用了 TCP 确认,所以基本上他只是推送 TCP 数据包并查看它们是否“仍然存在”:如果他检测到它们在一定时间后没有被处理,连接就会被简单地关闭.

我真的不知道该怎么做,我已经禁用了 Windows 7 的自动缩放调整和启发式方法,但这没有任何效果。我还注意到无法在 Windows 7 上设置 TPC Windows 大小 (RWIN)。

我知道这不是一个本身的编程相关问题,但不知何故,因为从代码的角度来看这很关键。

编辑
响应者表示:“您的应用程序没有足够快地从中提取数据”这很有趣,但我不知道如何优化它:

    private class IoContext
{
// The socket used for the operation:
public Socket _ipcSocket;
// The buffer used for the operation:
public VfxMsgBlock _ipcBuffer;

public IoContext(Socket socket, VfxMsgBlock buffer)
{
_ipcSocket = socket;
_ipcBuffer = buffer;
}
}

private void InitiateRecv(IoContext rxContext)
{
rxContext._ipcSocket.BeginReceive(rxContext._ipcBuffer.Buffer, rxContext._ipcBuffer.WrIndex,
rxContext._ipcBuffer.Remaining(), 0, CompleteRecv, rxContext);
}

private void CompleteRecv(IAsyncResult ar)
{
IoContext rxContext = ar.AsyncState as IoContext;
if (rxContext != null)
{
int rxBytes = rxContext._ipcSocket.EndReceive(ar);
if (rxBytes > 0)
{
//Adjust the write index in the message block:
rxContext._ipcBuffer.WrIndex = rxContext._ipcBuffer.WrIndex + rxBytes;

//(...) Do Stuf here with data

rxContext._ipcBuffer.Crunch();

//Initiate another asynchronous read:
InitiateRecv(rxContext);
}
}
}

编辑 2
回应 Len Holgate:

我直接通过 c# 属性更改/检查了接收缓冲区大小(使用 GetSocketOption/SetSocketOption 遇到了一些麻烦)

当我改变套接字缓冲区大小时,我可以注意到一个轻微的性能变化,即使用大缓冲区 (1000000) 而不是 300 万(使用 10240 或更少(甚至 0,我不知道为什么.. .奇怪))

这是我收到的第一个 WireShark 日志:

[SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1380 SACK_PERM=1 WS=128

无论套接字的接收缓冲区大小如何,它都不会改变

关于 Windows 7 和 TCP Windows 大小,我的意思是在 Windows 中重写 TCP 管理导致它自动缩放,并且没有注册表参数可用于“手动”设置它。
然而,你是对的:在每个套接字的基础上,它可以使用接收缓冲区大小进行调整。
来源here等等

最佳答案

如果你在 TCP 中禁用 ack 处理,你就不再谈论 TCP。您正在使用一些看起来有点像 TCP 的奇怪的弗兰肯协议(protocol)。

通常,尽管您应该使用 Windows TCP 自动调整 - 它非常好,尽管它确实取决于对等方的 TCP(在您的情况下不是)。

如果您需要防止窗口变满,最好的办法是更快地处理数据 - 窗口变满很可能是因为您的应用程序没有足够快地从中提取数据。精简应该是你的第一个停靠港。使用异步套接字是一个好的开始,保持多个读取连续挂起,以便操作系统可以在数据准备就绪后立即将数据移交给您的应用程序,这将是朝着正确方向迈出的又一步。

最后,如果你想使用 UDP,你应该尝试使用 UDP 而不是奇怪的 TCP。

关于windows - WIndows 7 上的高频数据监听器 TCP 过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com