我的应用程序需要快速向大量客户端(1000-s)广播消息并收集结果.
我在考虑是否使用BeginSend/EndSend等系列函数,或者使用SendAsync系列 - 是否有任何性能差异?它们的区别是什么,除了*Async系列不需要分配IAsyncResult?
如果我理解正确,他们都使用IO完成端口和标准.net线程池...那么有什么区别?
我最近注意到了以下模式,但我并没有完全掌握CompletedSynchronously属性的用法:
IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel);
if (channelOpenResult.CompletedSynchronously)
{
CompleteOpenChannel(channelOpenResult);
}
Run Code Online (Sandbox Code Playgroud)
然后,在回调中:
void OnOpenCompleteChannel(IAsyncResult result)
{
if (result.CompletedSynchronously)
return;
else
CompleteOpenChannel(result);
}
Run Code Online (Sandbox Code Playgroud)
代码中的某个地方当然有一个功能:
void CompleteOpenChannel(IAsyncResult result) ...
Run Code Online (Sandbox Code Playgroud)
这是一种处理异步调用的方式,具体取决于它是否直接完成?但是为什么在这种情况下使用它,因为始终会调用AsyncCallback(它会吗?)?有人可以给出一个同步调用的例子吗?
对于C#和.NET的System.Net.Sockets.Socket.AcceptAsync方法,需要处理返回值"false"以便处理SocketAsyncEventArgs来自同步处理的连接的立即可用状态.微软提供了一些例子(在System.Net.Sockets.SocketAsyncEventArgs类页面),如果存在大量挂起连接,则会导致堆栈溢出,这可以在任何实现其处理模型的系统上利用.
解决此问题的其他想法是创建一个调用处理程序方法的循环,其条件是值Socket.AcceptAsync返回等于false,并且如果值指示操作则中断循环(以允许延迟处理)正在异步完成(真实).但是,此解决方案还会导致堆栈溢出漏洞,因为与SocketAsyncEventArgs传递的关联的回调Socket.AcceptAsync在方法结束时有一个调用Socket.AcceptAsync,该调用还有一个用于立即可用,同步接受的连接的循环.
正如您所看到的,这是一个非常可靠的问题,我还没有找到一个不涉及System.Threading.ThreadPool并创建大量其他方法和调度处理的好解决方案.据我所知,与之相关的异步套接字模型Socket.AcceptAsync需要的内容要多于MSDN上的示例中所示的内容.
有没有人有一个干净有效的解决方案来处理从Socket.AcceptAsync同步接受的立即挂起的连接,而无需创建单独的线程来处理连接而不使用递归?
我们有一个使用Delphi 2010和Indy 10开发的应用服务器.该服务器每秒接收超过50个请求并且运行良好.但在某些情况下,在我看来,Indy非常模糊.它们的组件很好,但有时我发现自己只是为了理解一个简单的事情而深入研究源代码.Indy缺乏良好的文档和良好的支持.
我遇到的最后一件事对我来说是一个大问题:我必须检测客户端何时正常断开连接(例如,当客户端崩溃或关闭时.不告诉服务器它将断开连接)并且indy无法去做.如果我想要,我将不得不开发心跳,汇集或TCP保持活动等算法.我不想花更多的时间来做一个,至少我认为,组件工作.经过一些研究,我发现这不是Indy的错,但这是所有阻塞套接字组件的问题.
现在我真的想把服务器的核心改成另一个好的套件.我必须承认我倾向于使用非阻塞套接字.基于此,我有一些问题:
我知道这一定是一个主观问题,但我真的很想听到你的意见.我的第一个问题是我最关心的问题.我不在乎我是否需要支付100,500,1000,10000美元,但我想要一个完整的解决方案.现在,我正在考虑Ip*的工作原理.
编辑
我觉得有些人不明白我想要什么.我不想创建自己的套接字.我已经使用插座很长一段时间了,我厌倦了它.真.
非阻塞套接字可以检测客户端断开连接.这是事实,它在整个互联网上都有很好的文档.非阻塞套接字始终检查套接字状态是否有新的传入数据,并且可以检测到套接字无效.这不是心跳算法.在客户端使用心跳算法,它会定期向服务器发送数据包(也称为保持活动状态)以告知它仍处于活动状态.
编辑
我不是说清楚.也许是因为英语不是我的主要语言.我并不是说可以在不尝试从套接字发送或接收数据的情况下检测掉线连接.我所说的是每个非阻塞套接字都可以这样做,因为它们不断尝试从套接字读取新的传入数据.为什么这么难理解?如果你们下载并运行ip*工程演示,特别是echoserver和echoclient(都使用TCP),你可以自己测试.我已经测试了它,它的工作方式与我预期的相同.即使您在非阻塞模式下使用旧的TCPSocketServer和TCPSocketClient,您也会看到我的意思.
我正在尝试在异步HTTP客户端中重用套接字,但是第二次我无法连接到主机.我基本上将异步HTTP客户端视为具有以下状态的状态机:
在连接状态下我打电话BeginConnect:
private void BeginConnect()
{
lock (_sync) // re-entrant lock
{
IPAddress[] addersses = Dns.GetHostEntry(_asyncTask.Host).AddressList;
// Connect to any available address
IAsyncResult result = _reusableSocket.BeginConnect(addersses, _asyncTask.Port, new AsyncCallback(ConnectCallback), null);
}
}
Run Code Online (Sandbox Code Playgroud)
Sending一旦建立成功连接,回调方法就会将状态更改为:
private void ConnectCallback(IAsyncResult result)
{
lock (_sync) // re-entrant lock
{
try
{
_reusableSocket.EndConnect(result);
ChangeState(EClientState.Sending);
}
catch (SocketException e)
{
Console.WriteLine("Can't connect to: " + _asyncTask.Host);
Console.WriteLine("SocketException: {0} Error Code: {1}", e.Message, e.NativeErrorCode);
ThreadPool.QueueUserWorkItem(o =>
{
// An …Run Code Online (Sandbox Code Playgroud) .NET中的套接字类有一些新的异步方法(比如Socket.ReceiveAsync).
我想了解他们的目的.据我了解,创建它们是为了避免IAsyncResult为每个操作创建一个新对象.
假设我要创建一个高性能的HTTP服务器.然后我需要为每个操作创建一个Request或Response对象.而请求或响应对象肯定有一些属性,也可能是其他类(或只是基元+字符串).我可能必须从数据库中获取信息(要创建更多对象).
我的观点是每个请求/回复可以创建很多对象.AsyncResult对象是否太重以至于会影响整个服务器的性能?或者MS是否意味着我应该为服务器中的所有对象使用flyweight模式(重用请求/回复对象而不是分配新对象)?
请赐教.
从MSDN有关新的Async方法:
这些增强功能的主要特征是避免在高容量异步套接字I/O期间重复分配和同步对象.当前由System.Net.Sockets.Socket类实现的Begin/End设计模式需要为每个异步套接字操作分配System.IAsyncResult对象
来源:http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx
这个问题不重复.我不是在问这个区别.我很清楚这种差异.如果他们添加了减少分配和GC工作的方法,我应该在套接字处理之上的协议层中做同样的事情吗?即我应该使用flyweight模式HttpReqest等对象等.
我正在为游戏编写服务器,并且希望能够处理数千个并发用户。出于这个原因,我使用了非阻塞套接字并使用了 poll 方法。但是,我确实创建了多个线程来处理数据库和 Web 调用,其中一些线程会向用户发送响应。在这些线程之一中,在发送时,我收到错误“无法立即完成非阻塞套接字操作”。什么可能导致这个问题?我想这是因为在调用 send 的同时进行了轮询。如果我使用beginAsync,是否需要停止这个错误?我想锁定套接字,但我不希望我的主线程因此被阻塞。
sockets ×6
asynchronous ×4
c# ×4
.net ×3
components ×1
delphi ×1
http ×1
httpclient ×1
performance ×1
silverlight ×1
web-services ×1