Починин Socket

This commit is contained in:
2025-03-31 20:09:45 +03:00
committed by sasklyarov
parent d5e4c08527
commit 215236fa15
3 changed files with 41 additions and 23 deletions

View File

@ -38,7 +38,7 @@ namespace DroneSimulator
private int SocketID = 0;
private int SocketLimit;
private Socket? ServerSocket = null;
private Socket? ServerSocket;
private List<ClientData> ClientSockets = new List<ClientData>();
public delegate void ServerCallback(object o);
@ -46,14 +46,21 @@ namespace DroneSimulator
private ServerCallback? ConnectionCallback;
private ServerCallback? ReceiveCallback;
private bool Active = false;
public enum ServerState { Error, Start, Stop };
public ServerState StartServer(int Port, int Limit, ServerCallback Connection, ServerCallback Receive)
{
if (ServerSocket != null)
if (Active)
{
ServerSocket.Close();
foreach (ClientData c in ClientSockets) { c.workSocket?.Shutdown(SocketShutdown.Both); c.workSocket?.Close(); }
ServerSocket?.Close();
foreach (ClientData c in ClientSockets)
{
try { c.workSocket?.Shutdown(SocketShutdown.Both); } catch { }
c.workSocket?.Close();
}
ClientSockets.Clear();
return ServerState.Stop;
}
@ -70,8 +77,9 @@ namespace DroneSimulator
ServerSocket.Bind(ip);
ServerSocket.Listen(10);
ServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), ServerSocket);
Active = true;
}
catch { ServerSocket.Close(); ServerSocket = null; return ServerState.Error; }
catch { ServerSocket.Close(); return ServerState.Error; }
return ServerState.Start;
}
@ -84,7 +92,7 @@ namespace DroneSimulator
Socket handler;
try { handler = listener.EndAccept(ar); }
catch{ ServerSocket?.Close(); ServerSocket = null; return; }
catch{ ServerSocket?.Close(); Active = false; return; }
if (SocketLimit > ClientSockets.Count)
{
@ -127,7 +135,11 @@ namespace DroneSimulator
ReceiveCallback(new ReceiveData { ID = cd.ID, Buffer = cd.buffer, Size = bytes, Client = cd.workSocket });
cd.workSocket?.BeginReceive(cd.buffer, 0, ClientData.BufferSize, 0, new AsyncCallback(ReadCallback), cd);
try
{
cd.workSocket?.BeginReceive(cd.buffer, 0, ClientData.BufferSize, 0, new AsyncCallback(ReadCallback), cd);
}
catch { }
}
}
}