Починин Socket
This commit is contained in:
parent
ffc309ce21
commit
a35d7fdb97
@ -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 { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 });
|
||||||
|
|
||||||
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 { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user