利用.net Socket 的Acceptex方法加速你的连接

今天因为一个需要,要研究一下sock的异步性能,就用Reflector看了看。发现在调用的时候.net优先调用的是acceptex的 api,而不是accept api。在msdn里查看了一下这两者的区别:

The AcceptEx function uses overlapped I/O, unlike the accept function. If your application uses AcceptEx, it can service a large number of clients with a relatively small number of threads. As with all overlapped Windows functions, either Windows events or completion ports can be used as a completion notification mechanism.

 

Another key difference between the AcceptEx function and the accept function is that AcceptEx requires the caller to already have two sockets:

  • One that specifies the socket on which to listen.
  • One that specifies the socket on which to accept the connection.


it can service a large number of clients with a relatively small number of threads
这句话那是非常的诱人啊!

那我们再来看看什么情况下可以使用这个扩展的Accept呢?

首先在.net的Accept非异步函数里面是不可以调用这个的,只有在异步调用里面才有:BeginAccept方法
其反编译后如下:
[HostProtection(SecurityAction.LinkDemand, ExternalThreading = true )]
public  IAsyncResult BeginAccept(AsyncCallback callback,  object  state)
{
    
if (this.CanUseAcceptEx)
    
{
        
return this.BeginAccept(0, callback, state);
    }

    
if (s_LoggingEnabled)
    
{
        Logging.Enter(Logging.Sockets, 
this"BeginAccept""");
    }

    
if (this.CleanedUp)
    
{
        
throw new ObjectDisposedException(base.GetType().FullName);
    }

    AcceptAsyncResult asyncResult 
= new AcceptAsyncResult(this, state, callback);
    asyncResult.StartPostingAsyncOp(
false);
    
this.DoBeginAccept(asyncResult);
    asyncResult.FinishPostingAsyncOp(
ref this.Caches.AcceptClosureCache);
    
if (s_LoggingEnabled)
    
{
        Logging.Exit(Logging.Sockets, 
this"BeginAccept", asyncResult);
    }

    
return asyncResult;
}



下面是CanuseAcceptEx属性的反编译:
private   bool  CanUseAcceptEx
{
    
get
    
{
        
if (!ComNetOS.IsWinNt)
        
{
            
return false;
        }

        
if (!Thread.CurrentThread.IsThreadPoolThread && !SettingsSectionInternal.Section.AlwaysUseCompletionPortsForAccept)
        
{
            
return this.m_IsDisconnected;
        }

        
return true;
    }

}

 
那个iswinnt还没有找到相关资料,不过看字面意思看起来是平台相关的,是winnt系统应该都可以。
另外检验其他的是否为线程池和是否总是使用完成端口的检测如果不通过的话就检测连接是否还连接着。

其中再各个重载方法中,最重要的是检测IsWinNt选项,要不然就不会执行这个AcceptEx方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值