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更改为再次连接到受体,但仍收到此异常。谁能看到这是怎么回事?