EndAccept异常引发的问题
具体问题: 在EndAccept执行时会产生 10054错误.已经由try捕获,但EndAccept会阻塞线程,以下为部分代码
private void asyncAcceptCall(IAsyncResult ar)
{
Status status = new Status();
SocketError _errorCode;
try
{
//服务器的Socket
Socket ServerSocket = (Socket)ar.AsyncState;
Socket ClientSocket = ServerSocket.EndAccept(ar);
//线程会在此处阻塞,当EndAccept报错时,阻塞时会影响其它客户端的接收.
status.Client = ClientSocket;
status.Buff = new byte[4 * 1024];
status.Ip = (IPEndPoint)ClientSocket.RemoteEndPoint;
status.Client.BeginReceive(status.Buff, 0,
status.Buff.Length,
SocketFlags.None,
out _errorCode,
new AsyncCallback(asynReceCall),
status);
}
catch (SocketException se)
{
if (se.ErrorCode == 10054)
{
WriteException("网络连接异常");
}
}
catch (Exception e)
{
WriteException("其它错误 查看日志");
}
finally
{
mSocket.BeginAccept(new AsyncCallback(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断开 ,引发异常,程序才继续执行. --------------------编程问答--------------------
在服务端,你把listener设为全局变量。
public void beginListener()
{
listener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptCallback), listener);
}
public void DoAcceptCallback(IAsyncResult ar)
{
try
{
beginListener();
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(ar);
...
}
catch(Exception e)
{
//在抛出异常的时候做相应处理
}
}
这样每个连接请求相当于是独立的,就不会相互影响了。
补充:.NET技术 , C#