Починин Socket

This commit is contained in:
Sergey Sklyarov 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

@ -31,6 +31,7 @@ namespace DroneSimulator
public byte[] buffer = new byte[size]; public byte[] buffer = new byte[size];
} }
private bool Connected = false;
private Socket? ServerSocket = null; private Socket? ServerSocket = null;
private ServerData DataServer = new ServerData(); private ServerData DataServer = new ServerData();
@ -43,10 +44,11 @@ namespace DroneSimulator
public ClientState Connect(string Addr, int Port, ClientCallback Connection, ClientCallback Receive) public ClientState Connect(string Addr, int Port, ClientCallback Connection, ClientCallback Receive)
{ {
if (ServerSocket != null) if (Connected)
{ {
ServerSocket.Close(); try { ServerSocket?.Shutdown(SocketShutdown.Both); } catch { }
ServerSocket = null; ServerSocket?.Close();
Connected = false;
return ClientState.Stop; return ClientState.Stop;
} }
@ -56,24 +58,26 @@ namespace DroneSimulator
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Addr), Port); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Addr), Port);
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try try { ServerSocket.Connect(ep); }
{ catch { ServerSocket.Close(); return ClientState.Error; }
ServerSocket.Connect(ep);
} Connected = true;
catch { ServerSocket.Close(); ServerSocket = null; return ClientState.Error; }
ConnectionCallback(new ConnectData { Connect = true, Server = ServerSocket }); ConnectionCallback(new ConnectData { Connect = true, Server = ServerSocket });
ReceiveData receiveData = new ReceiveData { Buffer = DataServer.buffer, Size = ServerData.size, Server = ServerSocket }; ReceiveData receiveData = new ReceiveData { Buffer = DataServer.buffer, Size = ServerData.size, Server = ServerSocket };
ServerSocket.BeginReceive(DataServer.buffer, 0, ServerData.size, 0, new AsyncCallback(ReadCallback), receiveData);
try { ServerSocket.BeginReceive(DataServer.buffer, 0, ServerData.size, 0, new AsyncCallback(ReadCallback), receiveData); }
catch { }
return ClientState.Connected; return ClientState.Connected;
} }
public void Close() public void Close()
{ {
try { ServerSocket?.Shutdown(SocketShutdown.Both); } catch { }
ServerSocket?.Close(); ServerSocket?.Close();
ServerSocket = null; Connected = false;
} }
public void ReadCallback(IAsyncResult ar) public void ReadCallback(IAsyncResult ar)
@ -82,23 +86,23 @@ namespace DroneSimulator
if (cd == null) return; if (cd == null) return;
int bytes = 0; int bytes = 0;
try { bytes = ServerSocket.EndReceive(ar); } try { bytes = ServerSocket.EndReceive(ar); } catch { }
catch { }
if (bytes == 0) if (bytes == 0)
{ {
ServerSocket?.Close(); ServerSocket?.Close();
if (ServerSocket != null) ConnectionCallback(new ConnectData { Connect = false, Server = null }); Connected = false;
ServerSocket = null; if (ServerSocket != null) ConnectionCallback(new ConnectData { Connect = false, Server = null });
return; return;
} }
ReceiveCallback(new ReceiveData { Buffer = cd.Buffer, Size = bytes, Server = ServerSocket }); ReceiveCallback(new ReceiveData { Buffer = cd.Buffer, Size = bytes, Server = ServerSocket });
ServerSocket?.BeginReceive(cd.Buffer, 0, ServerData.size, 0, new AsyncCallback(ReadCallback), cd); try { ServerSocket?.BeginReceive(cd.Buffer, 0, ServerData.size, 0, new AsyncCallback(ReadCallback), cd); }
catch { }
} }
} }
} }

View File

@ -81,7 +81,8 @@ namespace DroneSimulator
od.PosX= drone.PosXYZ.X; od.PosY = drone.PosXYZ.Y; od.PosX= drone.PosXYZ.X; od.PosY = drone.PosXYZ.Y;
od.LaserRange = drone.LaserRange; od.LaserRange = drone.LaserRange;
data.Client.Send(od.getBytes()); try { data.Client.Send(od.getBytes()); }
catch { }
} }
private void button_Client_Start_Click(object sender, EventArgs e) private void button_Client_Start_Click(object sender, EventArgs e)
@ -102,6 +103,7 @@ namespace DroneSimulator
} }
case NetServerClients.ServerState.Stop: case NetServerClients.ServerState.Stop:
{ {
label_Clients_Num.Text = "0";
button_Client_Start.Text = "Start"; button_Client_Start.Text = "Start";
button_Client_Start.BackColor = Color.Transparent; button_Client_Start.BackColor = Color.Transparent;
break; break;

View File

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