diff --git a/DroneClient/NetClient.cs b/DroneClient/NetClient.cs index 603c61f..27f8f61 100644 --- a/DroneClient/NetClient.cs +++ b/DroneClient/NetClient.cs @@ -31,6 +31,7 @@ namespace DroneSimulator public byte[] buffer = new byte[size]; } + private bool Connected = false; private Socket? ServerSocket = null; private ServerData DataServer = new ServerData(); @@ -43,10 +44,11 @@ namespace DroneSimulator public ClientState Connect(string Addr, int Port, ClientCallback Connection, ClientCallback Receive) { - if (ServerSocket != null) + if (Connected) { - ServerSocket.Close(); - ServerSocket = null; + try { ServerSocket?.Shutdown(SocketShutdown.Both); } catch { } + ServerSocket?.Close(); + Connected = false; return ClientState.Stop; } @@ -56,24 +58,26 @@ namespace DroneSimulator IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Addr), Port); ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - try - { - ServerSocket.Connect(ep); - } - catch { ServerSocket.Close(); ServerSocket = null; return ClientState.Error; } + try { ServerSocket.Connect(ep); } + catch { ServerSocket.Close(); return ClientState.Error; } + + Connected = true; ConnectionCallback(new ConnectData { Connect = true, 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; } public void Close() { + try { ServerSocket?.Shutdown(SocketShutdown.Both); } catch { } ServerSocket?.Close(); - ServerSocket = null; + Connected = false; } public void ReadCallback(IAsyncResult ar) @@ -82,23 +86,23 @@ namespace DroneSimulator if (cd == null) return; int bytes = 0; - try { bytes = ServerSocket.EndReceive(ar); } - catch { } + try { bytes = ServerSocket.EndReceive(ar); } catch { } if (bytes == 0) { 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; } 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 { } } } } diff --git a/DroneSimulator/FormMain.cs b/DroneSimulator/FormMain.cs index b7926ff..9e6489a 100644 --- a/DroneSimulator/FormMain.cs +++ b/DroneSimulator/FormMain.cs @@ -81,7 +81,8 @@ namespace DroneSimulator od.PosX= drone.PosXYZ.X; od.PosY = drone.PosXYZ.Y; 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) @@ -102,6 +103,7 @@ namespace DroneSimulator } case NetServerClients.ServerState.Stop: { + label_Clients_Num.Text = "0"; button_Client_Start.Text = "Start"; button_Client_Start.BackColor = Color.Transparent; break; diff --git a/DroneSimulator/NetServerClients.cs b/DroneSimulator/NetServerClients.cs index d8ebdce..0a6384d 100644 --- a/DroneSimulator/NetServerClients.cs +++ b/DroneSimulator/NetServerClients.cs @@ -38,7 +38,7 @@ namespace DroneSimulator private int SocketID = 0; private int SocketLimit; - private Socket? ServerSocket = null; + private Socket? ServerSocket; private List ClientSockets = new List(); 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 { } } } }