UDP启动之后使用 clientSocket.BeginReceive接收数据
但是在关闭时经常出现 “由于以前的关闭调用,套接字在那个方向已经关闭,发送或接收数据的请求没有被接受。”的错误,
下面是原来Socket关闭代码
//关闭socket
if (clientSocket != null)
{
try
{
if (clientSocket.Connected)
{
//关闭Socket之前,首选需要把双方的Socket Shutdown掉
clientSocket.Shutdown(SocketShutdown.Both);
//Shutdown掉Socket后主线程停止10ms,保证Socket的Shutdown完成
Thread.Sleep(10);
//关闭客户端Socket,清理资源
clientSocket.Close();
Log.Debug("ClientSocket--->关闭成功");
}
}
catch (System.Exception e)
{
Log.Error($"ClientSocket关闭失败---------> {e.Message}");
}
clientSocket = null;
}
因为在关闭了socket之后,在异步接收进程,仍然访问了socket,导致出现异常
在Socket.BeginReceive进程中和关闭客户端时加了个lock进行访问限制
private readonly static object _lock = new object();
private static bool applicationIsQuitting = false;
protected static bool ApplicationIsQuitting
{
get
{
lock(_lock)
{
return applicationIsQuitting;
}
}
set
{
applicationIsQuitting = value;
}
}
/// <summary>
/// 异步接收数据
/// </summary>
/// <param name="ar"></param>
void AsyncCallBack(IAsyncResult ar)
{
try
{
if (ApplicationIsQuitting)
return;
if (clientSocket != null)
{
len = clientSocket.EndReceive(ar);
if (len > 0)
{
ReadMsg(buffer, len, ProcessDataCallBack);
}
}
}
catch (SocketException e)
{
Log.Error(e.Message);
SetNetStates(NetState.Error);
}
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, AsyncCallBack, buffer);
}
private void Close()
{
ApplicationIsQuitting = true;
if (clientSocket != null)
{
try
{
if (clientSocket.Connected)
{
//关闭Socket之前,首选需要把双方的Socket Shutdown掉
clientSocket.Shutdown(SocketShutdown.Both);
//Shutdown掉Socket后主线程停止10ms,保证Socket的Shutdown完成
Thread.Sleep(10);
//关闭客户端Socket,清理资源
clientSocket.Close();
Log.Debug("ClientSocket--->关闭成功");
}
}
catch (System.Exception e)
{
Log.Error($"ClientSocket关闭失败---------> {e.Message}");
}
clientSocket = null;
}
}
加了lock之后没再出现上述问题
记录一下解决方法,哪位大佬认为解决思路有问题,可以留言改正,以免误人子弟,谢谢