问题标签 [socketasynceventargs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
37 浏览

c# - 在具有许多客户端的服务器中使用一个端口与多个端口?

我正在用 C# 编写服务器代码,我认为用一个端口为所有客户端(比如我梦中的数百万)提供服务是好的(甚至可能),或者最好使用例如 1000 个端口并使用更少 -每个客户端使用的端口或随机端口!性能影响是什么?

0 投票
0 回答
240 浏览

c# - SendAsync 和 SocketAsyncEventArgs 使用固定滴答率正确使用

我目前正在使用 C# 中的套接字在 TCP 服务器上工作。我遇到了一个问题,我无法解决它..

我的服务器接受连接并为每个客户端创建一个新的 NetEntity。这些 NetEntities 处理发送/接收数据包,并在每秒 30 次的循环中更新。

问题:连接第 4 个客户端后,我收到此异常(仅在第 4 个 NetEntity 上)。

已使用此 SocketAsyncEventArgs 实例进行异步套接字操作。

如果我 if (Interlocked.Read(ref m_sending) == 1) return;用来确保它完成发送,第四个 NetEntity 永远不会发送任何数据。删除此行时会发生异常。

我只是无法正确使用固定的滴答率SendAsyncSocketAsyncEventArgs

设置看起来像这样

我感谢任何帮助和代码改进。

谢谢!

0 投票
0 回答
94 浏览

c# - 使用 System.Buffers.ArrayPool 的池化数组损坏

我正在尝试用 C# 编写一个小型、简洁的异步 TCP 套接字服务器。此示例只是将每个请求数据包回显给其连接的客户端。目前,我遇到了池阵列损坏的问题。由于数据包头接收缓冲区损坏,我的示例引发异常(第 27 行)。缓冲区中的值将是负数或巨大的(对于数据包长度而言,大约为数百兆字节)。这是由于缓冲区中位置 0-4 的字节被设置为随机值。

编辑:我忘了提到损坏只在运行一两分钟后出现(仅抛出异常)。此外,对于单个客户端似乎还可以,但对于更多的客户端,腐败的可能性更高。

EDIT2:无论出于何种原因,该错误都是零星的,并且不容易重现。我试图在多台计算机上运行代码,并且在两台计算机上都出现了问题(但也没有发生)。我已经完成了整个运行而没有错误,并且我在 1 分钟或 5 分钟内(或其他各种时间)出现了运行错误。我实现了一个信号量来尝试更轻松地控制活动客户端的数量,但它无助于显示错误。

我不确定我是否遇到了 Use-After-Free 错误、Double-Free 或其他问题。我已经三重检查了我的缓冲区租用和释放,但似乎没问题。到目前为止,我已将损坏范围缩小到仅在执行第 376 行之后发生(在将响应发送回客户端并且正在设置套接字参数以接收下一个请求数据包标头之后)。

异常堆栈跟踪是:

缓冲区寿命

单个请求-响应周期的缓冲区的预期生命周期如下:

  • 应在租用主体接收缓冲区之前返回标头接收缓冲区(因为相关的标头信息已被复制出来:参见 HandleReceive,第 212-225 行)。

  • 主体接收缓冲区生存期应与响应发送缓冲区生存期重叠(因为必须将请求内容复制到响应主体缓冲区:请参阅 HandleClient,第 367-377 行)。

代码

GitHub 要点:https ://gist.github.com/mblenczewski/b0a302d443ef95e1d2eaefa6f3a18582

0 投票
0 回答
76 浏览

c# - C# SocketAsyncEventArgs:为什么要消耗这么多 CPU?

SocketAsyncEventArgs用于将缓冲区、偏移量和长度传递到Socket的ReceiveAsyncSendAsync方法中。

我做过测试,结果表明,

  • 如果我不处理SocketAsyncEventArgs,会导致内存泄漏。
  • 创建它、释放它并调用它的 SetBuffer 方法都会消耗大量的 CPU。

SocketAsyncEventArgs似乎是一个非常糟糕和错误的实现,它只是充当一个将缓冲区、其偏移量和长度传递给Socket的异步方法的包装器,会消耗大量 CPU。

有谁知道为什么?那么,如何将它与Socket的异步方法一起使用,而不会显着降低我的高吞吐量服务器的速度?

以下是测试代码。此测试方法被 1000 个线程调用。它被称为每秒 1000 次。但是如果我删除SocketAsyncEventArgs,它每秒被调用8000次。这似乎表明SocketAsyncEventArgs.SetBuffer消耗了大量的 CPU。