EndAccept异常引发的问题

问题描述

具体问题:在EndAccept执行时会产生10054错误.已经由try捕获,但EndAccept会阻塞线程,以下为部分代码privatevoidasyncAcceptCall(IAsyncResultar){Statusstatus=newStatus();SocketError_errorCode;try{//服务器的SocketSocketServerSocket=(Socket)ar.AsyncState;SocketClientSocket=ServerSocket.EndAccept(ar);//线程会在此处阻塞,当EndAccept报错时,阻塞时会影响其它客户端的接收.status.Client=ClientSocket;status.Buff=newbyte[4*1024];status.Ip=(IPEndPoint)ClientSocket.RemoteEndPoint;status.Client.BeginReceive(status.Buff,0,status.Buff.Length,SocketFlags.None,out_errorCode,newAsyncCallback(asynReceCall),status);}catch(SocketExceptionse){if(se.ErrorCode==10054){WriteException("网络连接异常");}}catch(Exceptione){WriteException("其它错误查看日志");}finally{mSocket.BeginAccept(newAsyncCallback(asyncAcceptCall),mSocket);}}

请问:1,在这个情况下为什么会出现10054错误,客户端为移动设备,采用的是GSM网络.2,阻塞时间为5-20秒,其间的连接处理会暂停,会对其它客户端有什么影响3,出现了10054错误,后续要如何操作.说明:客户端已经不可更改,只能在服务器处理.

解决方案

解决方案二:
1.不太清楚2.服务端应该有个监听线程吧,如果有一个socket申请就BeginAccept,在回调方法里,重新执行BeginAccept,然后再把传进来的异步操作状态转换为Listener,然后用这个Listener来EndAccept,这样就不会影响下一个socket连接申请。3.不太清楚。。。
解决方案三:
是这样,我采用的是Socket异步方式,主要问题是EndAccept引发的异常,10054错误.也就是当客户端断开时,EndAccept就阻塞住了,直到服务器发现Socket断开,引发异常,程序才继续执行.
解决方案四:
引用2楼sostonesi的回复:

是这样,我采用的是Socket异步方式,主要问题是EndAccept引发的异常,10054错误.也就是当客户端断开时,EndAccept就阻塞住了,直到服务器发现Socket断开,引发异常,程序才继续执行.

在服务端,你把listener设为全局变量。publicvoidbeginListener(){listener.BeginAcceptTcpClient(newAsyncCallback(DoAcceptCallback),listener);}publicvoidDoAcceptCallback(IAsyncResultar){try{beginListener();TcpListenerlistener=(TcpListener)ar.AsyncState;TcpClientclient=listener.EndAcceptTcpClient(ar);...}catch(Exceptione){//在抛出异常的时候做相应处理}}

这样每个连接请求相当于是独立的,就不会相互影响了。
解决方案五:
我认为在这里有个BUG正确的处理方式:Statusstatus=newStatus();SocketError_errorCode;try{//服务器的SocketSocketServerSocket=(Socket)ar.AsyncState;SocketClientSocket=ServerSocket.EndAccept(ar);//线程会在此处阻塞,当EndAccept报错时,阻塞时会影响其它客户端的接收.status.Client=ClientSocket;status.Buff=newbyte[4*1024];status.Ip=(IPEndPoint)ClientSocket.RemoteEndPoint;/*不要在这里重发,否则任务数会越来越多status.Client.BeginReceive(status.Buff,0,status.Buff.Length,SocketFlags.None,out_errorCode,newAsyncCallback(asynReceCall),status);*/}catch(SocketExceptionse){if(se.ErrorCode==10054){WriteException("网络连接异常");}}catch(Exceptione){WriteException("其它错误查看日志");}finally{//设置active标志,在程序退出前将active设为falseif(active){mSocket.BeginAccept(newAsyncCallback(asyncAcceptCall),mSocket);}}

但是,以上代码可能仍然存在问题,当.EndAccept抛出SocketException异常时,SocketClientSocket没有接收到返回值,因此我们无法获取到这个异常的Socket对象并将其关闭,所以会导致句柄泄露。EndAccept的SocketException10054错误会在客户端连接服务器成功后立即又关闭连接时发生。

时间: 2024-09-07 18:39:39

EndAccept异常引发的问题的相关文章

纳斯达克遭遇黑色3小时:一条数据专线“异常”引发的失控

麦当劳表示,"很多高频交易算法是超出正常人理解的,其每秒可以交易上万次,但如果失败一次 就会失控,这就会看到 纳斯达克停摆事件." 继A股光大"8·16"事件后,<http://www.aliyun.com/zixun/aggregation/5254.html">每日经济新闻>记者获悉,上周四(8月22日),纳斯达克数千档交易同时暂停3个多小时,包括苹果.谷歌等超过3000家美国上市公司无法交易,出现了世纪大停摆,开创了美股乌龙事件的又

Python回顾与整理8:错误和异常

0.说明         如果想写出用户体验高的代码,那么就需要考虑到在执行自己写的这段代码中在和用户交互的过程中可能会出现的问题,也就是说,需要对可能出现的异常进行处理,只有做好这些工作,才能写出用户体验好的代码. 1.什么是异常 错误         错误是语法(导致解释器无法解释)或逻辑(也就是代码质量问题)上的,在Python中,当检测到错误时,解释器会指出当前流无法继续执行下去,于是就出现了异常. 异常         程序出现了错误而在正常控制流以外采取的行为.         根据

关于Ibatis和Spring的一个异常错误

问题描述 Exception in thread "main" java.lang.ExceptionInInitializerErrorat com.neusoft.gw.util.Launcher.main(Launcher.java:24)Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined i

&amp;gt; 第七章 异常处理(rainbow 翻译) (来自重粒子空间)

<<展现C#>> 第七章 异常处理(rainbow 翻译) 出处:http://www.informit.com/matter/ser0000002 正文: 第七章   异常处理     通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的.一个在C#中所引发的异常可以在Visual Basic客户中得到处理.不再有 HRESULTs  或者 ISupportErrorInfo 接口.    尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理.你

《.net编程先锋C#》第七章 异常处理(转)

编程|异常处理 第七章 异常处理通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的.一个在C#中所引发的异常可以在Visual Basic客户中得到处理.不再有 HRESULTs 或者 ISupportErrorInfo 接口.尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理.你稍为改变编译器的溢出处理行为,接着有趣的事情就开始了:你处理了该异常.要增加更多的手段,随后引发你所创建的异常. 7.1 校验(checked)和非校验(unchecked)语句当

第十二章-异常处理与程序调试(一)(4)

12.1.2 对象异常类 所谓对象异常是指非部件的对象引发的异常.Delphi定义的对象异常包括流异常.打印异常.图形异常.字符串链表异常等. 12.1.2.1 流异常类 流异常类包括EStreamError.EFCreateError. EFOpenError.EFilerError.EReadError.EWriteError.EClassNotFound.它们的结构关系如下: EStreamError |---------- EFCreateError |---------- EFOpen

从零开始学Oracle—异常处理(八)

一.异常 (1) 程序错误 - 编译时 - 运行时 (2)异常 - 处理运行时错误 .PL/SQL是如何处理异常的? - 错误引发异常 - 每当引发异常时,都将控制权传递给异常处理程序 - 异常处理程序处理异常 .异常中涉及的步骤 - 声明异常 - 引发异常 - 处理异常 .异常的类型 - 预定义的异常 --由Oracle服务器维护异常 - 非预定义的异常 又称'用户定义异常' 1.预定义异常 由Oracle为常见错误预定义 在DBMS_Standard程序包中提供了这些定义 不需要显式声明 d

.NET:轮询访问ThreadPool

问:我目前正在使用 Microsoft .NET Framework ThreadPool,在使用过程中我遇到了一种情况,不知道该如何解决.我需要处理一个较大批次的已在队列中的工作项,在第一个批次开始处理后第二个批次(规模稍小)到达.最初,较大批次中的一些工作将被分配给 ThreadPool 中的所有工作线程.但是,当第二批到达后,我想平均分配,使每一批都得到同样的服务,而不是先到的批次得到所有线程. 当其中一批完成时,我希望无论哪一个仍需处理的批次,都能够获得所有工作线程的关注.我该如何在 T

C#基础语法:可空类型详解

  这篇文章主要介绍了C#基础语法:可空类型详解,本文分析了可空类型的源码.研究了可空类型强制转换为常规类型.可空类型的运算等内容,需要的朋友可以参考下 以下是System.Nullable在FCL中的定义. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51