110,567
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
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
{
//设置active标志,在程序退出前将active设为false
if(active){
mSocket.BeginAccept(new AsyncCallback(asyncAcceptCall), mSocket);
}
}
但是,以上代码可能仍然存在问题,当.EndAccept抛出SocketException异常时,Socket ClientSocket没有接收到返回值,因此我们无法获取到这个异常的Socket对象并将其关闭,所以会导致句柄泄露。
EndAccept的SocketException 10054错误会在客户端连接服务器成功后立即又关闭连接时发生。
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)
{
//在抛出异常的时候做相应处理
}
}
这样每个连接请求相当于是独立的,就不会相互影响了。