• WCF NetTcpBinding 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作


    背景:WindowsService + WCF + NetTcpBinding

    之前一直使用http协议模式,改为net.tcp之后隔段时间出现:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 127.0.0.1:9000

    记录时间:2016-01-14 10:02:58
    日志级别:Exception
    日志位置:CloudTraPlatSOA.Abstract.AbInSideSMS
    当 前 行: 85
    方法名称: SendMessageInfo
    日志描述:发送到[185*******]短信失败,内容:高兴的通知您:已经成功办理 [ 基础会员 ] ,会员到期时间:2017-01-14
    Ex.Message: Unable to connect to the remote server
    InnerException.Message: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 127.0.0.1:9000
    Message.StackTrace:    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
       at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, 
    
    IAsyncResult asyncResult, Int32 timeout, Exception& exception)
    堆栈跟踪:
       at SyncInvokeWebSendMessage(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
       at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
       at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
       at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
       at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result)
       at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
       at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
       at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously, Exception exception)
       at System.ServiceModel.Channels.FramingDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)
       at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
       at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
       at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously, Exception exception)
       at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)
       at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
       at System.ServiceModel.Channels.SocketConnection.FinishRead()
       at System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead)
       at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
       at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
       at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
    异常日志

    原因:

    tcp的端口请求已经达到本地设置的界限(MaxUserPort)

    解决方式

    修改两个注册表:

    1.  HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParametersMaxUserPort  

      如果没有,则手动创建  DWord(32位)  ”数值数据“改为十进制65534 或者认为适当的值。此值表示 用户最大使用的端口数量,默认为5000。

    2. HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParametersTCPTimedWaitDelay 

      如果没有,则手动创建  DWord(32位)  ”数值数据“改为十进制30 或者你认为适当的值。此值表示一个关闭后的端口等待多久之后可以重新使用,默认为120秒,也就是2分钟    才可以重新使用。

    退出注册表编辑器,然后重新启动计算机

    MaxUserPort在MSDN的描述:https://technet.microsoft.com/zh-cn/library/cc938196.aspx

    MaxUserPort

    • 描述:确定当应用程序向系统请求获取可用的用户端口时,TCP/IP 可指定的最高端口号。
    • 如何查看或设置:

    1.     使用regedit命令,访问 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters 注册表子键,然后创建新的 REG_DWORD 值MaxUserPort。

    2.     将此值至少设置为十进制32768。

    3.     停止并重新启动系统。

      • 缺省值:
      • 建议值:至少为十进制32768。
    • 建议将 MaxUserPort 值设置为 60000(十六进制ea60。如果设置的 MaxUserPort 值低于 60000,可能会显示名称服务提供程序接口  (NSPI) 代理警告,例如事件 9040。

    TcpTimedWaitDelay

      • 描述:确定 TCP/IP 在释放已关闭的连接并再次使用其资源前必须经过的时间。关闭与释放之间的这段时间称为 TIME_WAIT 状态或者两倍最大段生存期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。通过减少此条目的值,TCP/IP  可以更快地释放关闭的连接,并为新连接提供更多资源。如果运行中的应用程序要求快速释放连接或创建新连接,或者由于多个连接处于 TIME_WAIT 状态而导致吞吐量较低,请调整此参数。
      • 如何查看或设置:

    1.     使用regedit命令,访问 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters 注册表子键,然后创建新的 REG_DWORD 值TcpTimedWaitDelay。

    2.     将此值设置为十进制30,即十六进制 0x0000001e。此值将等待时间设置为 30 秒。

    3.     停止并重新启动系统。

      • 缺省值:0xF0,此值将等待时间设置为 240 秒(4 分钟)。
      • 建议值:最小值为0x1E,此值将等待时间设置为 30 秒。
  • 相关阅读:
    Valid Palindrome
    Path Sum II
    Reverse Integer
    Palindrome Number
    ZigZag Conversion
    函数调用堆栈 涉及汇编(转)
    关于字符指针和字符数组初始化的问题
    Remove Element(第一种方法参考别人)
    c内存分配(转)
    int *ptr=(int *)(&a+1)问题的探讨
  • 原文地址:https://www.cnblogs.com/yf2011/p/5129829.html
Copyright © 2020-2023  润新知