Починин 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];
}
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 { }
}
}
}

View File

@ -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;

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 { }
}
}
}