System.Net.Sockets.SocketException(0x80004005):现有连接被c#套接字上的远程主机强行关闭

时间:2020-06-28 09:56:57

标签: c# .net sockets network-programming

public class ServerSocket
{
    private int Port;
    private Socket Sock;
    private BruteforceProtection protection;
    public Action<SocketWrapper> OnConnect, OnDisconnect;
    public Action<SocketWrapper, byte[]> OnReceive;
    public ServerSocket(int Port)
    {
        this.Port = Port;
        protection = new BruteforceProtection();
        Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Sock.Bind(new IPEndPoint(IPAddress.Any, Port));
        Sock.NoDelay = true;
        Sock.Listen(0);
        Sock.BeginAccept(new AsyncCallback(AcceptCallBack), null);
        Console.WriteLine($"Accepting on port {Port}");
    }

    private void AcceptCallBack(IAsyncResult ar)
    {
        try
        {
            Socket acceptor = Sock.EndAccept(ar);
            string IP = (acceptor.RemoteEndPoint as IPEndPoint).Address.ToString();
            if (protection.CanLogin(IP))
            {
                SocketWrapper wrapper = new SocketWrapper(this, acceptor);
                InvokeConnected(wrapper);
                wrapper.TryReceive();
            }
            else
                acceptor.Disconnect(false);
        }
        catch (Exception e)
        {
            Loggers.LoggersController.LogException(e.ToString());
        }
        finally
        {
            // Sock.BeginAccept(new AsyncCallback(AcceptCallBack), null);
            Sock.BeginAccept(new AsyncCallback(AcceptCallBack), acceptor);
        }
    }
    public void InvokeConnected(SocketWrapper wrapper)
    {
        if (OnConnect != null)
            OnConnect.Invoke(wrapper);
    }
    public void InvokeReceive(SocketWrapper wrapper, byte[] buffer)
    {
        if (OnReceive != null)
            OnReceive.Invoke(wrapper, buffer);
    }
    public void InvokeDisconnect(SocketWrapper wrapper)
    {
        if (OnDisconnect != null)
            OnDisconnect.Invoke(wrapper);
    }
}

这是我的代码。 Socket acceptor = Sock.EndAccept(ar);行正在抛出:

System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host

通常会在一个小时内发生,可能会在10分钟或59分钟内发生,但确实会发生。当我在某处看到此方法时,我尝试将final块从null更改为再次连接到受体,但仍收到此异常。谁能看到这是怎么回事?

0 个答案:

没有答案