- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试优化一个 tcp 套接字包装器,它在处理大量入站连接时遇到了困难。我正在一个基本的聊天服务器和一个小型客户端应用程序中测试它以将客户端发送给它。这两个应用程序都位于通过千兆交换机连接的单独 W2k3 服务器上。
通过反复试验,我将我的测试细化为 10 个客户端以 100 毫秒的间隔连接,然后一旦所有 10 个客户端都连接后,它们各自向服务器发送一个“进入房间”消息,再次以 100 毫秒的间隔。当服务器收到一条消息时,它会用房间中每个人的列表回复发件人,并向房间中的其他人发送一条消息,说有新来者。
每次发送都需要超过 1 秒的时间才能完成(对于 100 多个客户端,这会达到 3-4 秒),并且通过日志记录我已经确定延迟在 Socket.SendAync 和引发的相应事件之间。 CPU 使用率始终很低。
我已经尝试了所有我能想到的方法,并花了几天时间在网上寻找线索,但我完全不知所措。这不可能是正常的吧?
编辑:按要求编写代码。我已经整理了一下,删除了不相关的计数器和日志记录等,它目前在我尝试缩小问题范围时在 kludge 之上进行了 hack。
private void DoSend(AsyncUserToken token, String msg)
{
SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
writeEventArgs.Completed += ProcessSend;
writeEventArgs.UserToken = token;
Byte[] sendBuffer = Encoding.UTF8.GetBytes(msg + LineTerminator);
writeEventArgs.SetBuffer(sendBuffer, 0, sendBuffer.Length);
Interlocked.Add(ref m_totalBytesAttemptedSend, sendBuffer.Length);
Logger2.log(Logger2.Debug5, token.ConnectionId, "Total Bytes attempted: " + m_totalBytesAttemptedSend);
bool willRaiseEvent = true;
try
{
willRaiseEvent = token.Socket.SendAsync(writeEventArgs);
}
catch (Exception e)
{
Logger2.log(Logger2.Debug2, token.ConnectionId, e.Message);
writeEventArgs.Dispose();
}
if (!willRaiseEvent)
{
ProcessSend(null, writeEventArgs);
}
}
private void ProcessSend(Object sender, SocketAsyncEventArgs e)
{
AsyncUserToken token = (AsyncUserToken)e.UserToken;
Logger2.log(Logger2.Debug5, token.ConnectionId, "Send Complete");
if (e.SocketError == SocketError.Success)
{
Interlocked.Add(ref m_totalBytesSent, e.BytesTransferred);
Logger2.log(Logger2.Debug5, ((AsyncUserToken)e.UserToken).ConnectionId, "Total Bytes sent: " + m_totalBytesSent);
}
else
{
if (token.Connected)
{
CloseClientSocket(token);
}
}
e.Dispose();
}
最佳答案
您在每个连接上发送多少数据,发送速度有多快?
通常,异步发送需要很长时间才能完成的原因是您已经填满了 TCP 窗口(有关详细信息,请参阅 here)并且本地 TCP 堆栈无法发送更多数据,直到它从同行。如果您继续发送数据,那么您只是在网络子系统中将其本地排队,因为不允许堆栈发送它。拥塞和数据包丢失会使情况变得更糟,因为传输中的数据需要更长的时间才能到达对等方,而 ACK 需要更长的时间才能返回……
如果是这种情况(并且诸如 WireShark 之类的工具应该能让您看到窗口大小更新和零窗口情况等),那么增加连接的窗口大小可能会有所帮助(请参阅 here)。
如果你的协议(protocol)没有明确的流量控制,那么上述情况就更有可能发生。最好在您的协议(protocol)设计中包含某种形式的显式流量控制,恕我直言,以避免这种情况。
包含一些发送端保护也是明智的,因为无限制的发送者可以非常快速地咀嚼内存。我使用过的一种行之有效的方法是拥有一个可以放置出站数据的队列,并且来自该队列的数据实际上是根据早期发送的发送完成情况发送的(请参阅 here )。
关于c# - Socket.SendAsync 需要几秒钟才能完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841021/
我有一个使用 *Async 方法(如 SendAsync)通过套接字进行通信的应用程序。我在执行 SendAsync 但未通过网络发送数据时遇到这种奇怪的行为。 我已启用网络跟踪并获得以下日志: Sy
我编写了一个小 winforms 应用程序,它向本地网络中的每个 IP 地址发送 http 请求,以发现我的某个设备。在我的特定子网掩码上,有 512 个地址。我已经使用 backGroundWork
我一直在关注this VSTF_RD_Bot example code . 我无法构建此代码,因为我收到以下消息: The type arguments for method 'Conversatio
如以下简化代码所示,检查 SendAsync() 是否已完成缓冲区中所有预期字节的传输是正确的做法吗?还是那是多余的?这是一个 TCP 连接套接字。我特别担心必须在 ProcessSend() 中发出
在使用 SendAsync 时处理 SmtpClient 和 MailMessage 的正确方法是什么? 我已经在下面复制了我的代码。 { ... var client = new SmtpClien
我正在使用 SendAsync 方法循环发送 1000 条消息,并在这行代码中得到下面的异常 await _ws.SendAsync(new ArraySegment(messageBuffer, o
In asp.net - using Message Handlers - 我可以通过添加消息处理程序来自定义请求/响应。 因此,一个请求进入,通过多个消息处理程序,然后响应通过相同的处理程序(在相反
我正在调用以下函数来获取访问 token ,以便使用 REST Api 检索 Twitter 用户个人资料。 public async Task GetAccessToken() {
我刚刚编写了一些测试代码来查看 System.Net.Mail.SmtpClient 向我自己发送相同的消息。 int numClients = 10; List mailClients = new
我正在尝试使用 Atomix 在 Java 的两个进程之间发送消息和 Netty 。我有一个名为 Starter 的程序,它负责向所有正在等待该消息的正在运行的进程发送消息。 这是入门版: Addre
我正在尝试用 C# 构建一个小型应用程序,以从 Microsoft Graph API 检索建议的 session 时间。身份验证后,我调用 graphClient.HttpProvider.Send
我正在尝试编写一个辅助类来在我的 C# 应用程序中发送电子邮件。我想使用 SmtpClient.SendAsync,但显然我不了解异步的工作原理或者我设置了错误: public class Email
在我的应用程序中,我使用 Dataflow 库中的 ActionBlock,使用 SmtpClient.SendAsync() 发送电子邮件警报方法,它不会阻止调用线程。(ActionBlock 从
应用程序要求使用 SendAsync 而不仅仅是发送。所以我制作了一个 CEmailServer 类并设置了所有内容。到目前为止, Send 工作正常,但是当将其更改为与 SendAsync 一起使用
我有一个 Websocket HTTPListener 作为服务器,客户端是 WebSocket的 我将所有当前客户端保存在一个列表中,我想要一个向所有客户端异步发送信息的函数。 所以我目前拥有的是:
我正在尝试优化一个 tcp 套接字包装器,它在处理大量入站连接时遇到了困难。我正在一个基本的聊天服务器和一个小型客户端应用程序中测试它以将客户端发送给它。这两个应用程序都位于通过千兆交换机连接的单独
我正在尝试熟悉 smtp.SendAsync,但出于某种原因,我无法让邮件消息发送异步。 这是我试过的。 //smtp.SendAsync(mm, null)); Error, Async opera
我正在摆弄 Silverlight 的 TCP 通信,我被迫使用 System.Net.Sockets.Socket 类,它在 Silverlight 运行时只有异步方法。 我想知道如果两个线程在很短
我正在使用 .NET 4.0 的 ASP.NET Web API 客户端库(Microsoft.AspNet.WebApi.Client 版本 4.0.30506.0)。 我需要发送带有请求正文的 H
我有一个接口(interface),它有一个方法来创建队列客户端和消息工厂的实例。我已经创建了相同的具体实现,现在我正在尝试对用于将消息发送到队列的功能进行单元测试。我已经为相同的代码编写了以下代码:
我是一名优秀的程序员,十分优秀!