c# - SendAsync 和 SocketAsyncEventArgs 使用固定滴答率正确使用
问题描述
我目前正在使用 C# 中的套接字在 TCP 服务器上工作。我遇到了一个问题,我无法解决它..
我的服务器接受连接并为每个客户端创建一个新的 NetEntity。这些 NetEntities 处理发送/接收数据包,并在每秒 30 次的循环中更新。
问题:连接第 4 个客户端后,我收到此异常(仅在第 4 个 NetEntity 上)。
已使用此 SocketAsyncEventArgs 实例进行异步套接字操作。
如果我 if (Interlocked.Read(ref m_sending) == 1) return;
用来确保它完成发送,第四个 NetEntity 永远不会发送任何数据。删除此行时会发生异常。
我只是无法正确使用固定的滴答率SendAsync
。SocketAsyncEventArgs
public void Send(Packet packet)
{
OutgoingQueue.Enqueue(packet);
}
private void QueueSend()
{
Interlocked.Exchange(ref m_sending, 1);
var sendTask = new Task(Send);
sendTask.ContinueWith((t) => t.Dispose());
sendTask.Start();
}
private void Send()
{
if (Interlocked.Read(ref m_sending) == 1) return;
if (!Socket.Connected) return;
if (OutgoingQueue.TryDequeue(out var packet))
{
packet.Serialize(m_packetWriter);
}
var writerBuffer = m_packetWriter.ToArray();
Array.Copy(writerBuffer, m_sendBuffer, writerBuffer.Length);
try
{
SendArgs.SetBuffer(SendArgs.Offset, writerBuffer.Length);
if (!Socket.SendAsync(SendArgs))
{
SendCompleted(Socket, SendArgs);
}
}
catch (SocketException)
{
//Client disconnect
}
catch (Exception ex)
{
Log.Error($"NetEntity {m_id} send exception: {ex.Message} - {ex.StackTrace} - {ex.InnerException}");
}
}
private void SendCompleted(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
if (OutgoingQueue.Count > 0)
{
//QueueSend();
}
m_packetWriter.Reset();
}
else
{
Interlocked.Exchange(ref m_sending, 0);
}
}
设置看起来像这样
SendArgs = new SocketAsyncEventArgs();
SendArgs.SetBuffer(m_sendBuffer, 0, BufferSize);
SendArgs.Completed += SendCompleted;
我感谢任何帮助和代码改进。
谢谢!
解决方案
推荐阅读
- azure - 将事件文件处理到 Azure EventHub
- android-fragments - 如何根据参数制作一个具有 navGraphViewModels 之一的通用片段
- javascript - 如何将表格行值放入 JavaScript 中的文本字段..?
- python - 尝试创建同时继承 PySide6 类的 Python 抽象类时的元类冲突
- java - 解析在 Selenium 中执行的 javascript 的响应
- python - `run` 属性在什么时候附加到 Bocadillo 的 App 实例?遵循教程后缺少 run()
- javascript - 使用 Rollup 导入遗留(AMD 外观)依赖项
- delphi - Delphi 7 IDE 中的 TMaskEdit 缩小宽度问题
- angular - Afrer 返回一个 BehaviorSubject ,应用程序被拉出多个结果
- linux - 关闭时绕过 Haproxy