/// <summary> /// Пытается произвести рекурсивное подключение от компьютера к компьютеру, пока не установит цепочку связей до конечного компьютера /// </summary> /// <param name="con">Предыдущий компьютер в сети</param> /// <param name="targetHost">Целевой компьютер</param> /// <param name="mat">Ид раздачи</param> /// <returns>Сокет, подключенный к следующему компьютеру в цепочке, либо null, если маршрут не удалось установить</returns> Socket TryConnect(Connection con, out Client targetHost, int mat) { NetworkStream nStream = new NetworkStream(con.Socket); byte[] buf = new byte[6]; nStream.Read(buf, 0, 6); targetHost = new Client(); targetHost.Deserialize(buf); foreach (Client c in targets) { if (c == targetHost) { nStream.WriteByte((byte)(IDT_Protocol.TerminateTransaction)); return(null); } } Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { sock.Connect(targetHost.ip, targetHost.port); sock.Send(new byte[] { (byte)C_C_Protocol.Connect }); byte[] receive = new byte[2]; sock.Receive(receive, 0, 1, SocketFlags.None); sock.Receive(receive, 1, 1, SocketFlags.None); if ((C_C_Protocol)receive[0] != C_C_Protocol.Connected || receive[1] == 0) { sock.Close(); throw new SocketException(); } sock.Send(new byte[] { (byte)C_C_Protocol.IsMaterial }); byte[] temp = bc.GetBytes(mat); sock.Send(temp); sock.Receive(temp, 1, SocketFlags.None); if (temp[0] != (byte)C_C_Protocol.MaterialResponse) { sock.Close(); throw new SocketException(); } return(sock); } catch (SocketException) { foreach (Material m in ProgramMaterials.MaterialsArray) { foreach (Connection c in m.Connections) { IPAddress ip = ((IPEndPoint)c.Socket.RemoteEndPoint).Address; short port = (short)((IPEndPoint)c.Socket.RemoteEndPoint).Port; try { sock.Connect(ip, port); } catch (Exception) { continue; } return(Connect(targetHost, mat)); } } return(null); } }
private void ReadClients(string filename) { FileStream fs = new FileStream(filename, FileMode.Open); Read: while (fs.Length > fs.Position) { byte[] temp = new byte[6]; fs.Read(temp, 0, 6); Client t = new Client(); t.Deserialize(temp); IPAddress IP_Client = t.ip; short Port_Client = t.port; IPEndPoint ip; for (int i = 0; i < connections.Count; i++) { ip = (IPEndPoint)(connections[i].Socket.RemoteEndPoint); if (ip.Address.ToString() == IP_Client.ToString()) { goto Read; } } Socket socket_download = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { Connection con = new Connection(); con.Thread = new Thread(Download); con.Thread.IsBackground = true; con.Socket = socket_download; con.Thread.Start(con); socket_download.Connect(new IPEndPoint(IP_Client, Port_Client)); } catch (SocketException) { /*if (Config.IDT_Enaibled) * { * Client cl = new Client(IP_Client, Port_Client); * System.Threading.Thread th = new Thread(IDT_client); * th.Start(cl); * }*/ } } fs.Close(); }
/// <summary> /// Пытается произвести рекурсивное подключение от компьютера к компьютеру, пока не установит цепочку связей до конечного компьютера /// </summary> /// <param name="con">Предыдущий компьютер в сети</param> /// <param name="targetHost">Целевой компьютер</param> /// <param name="mat">Ид раздачи</param> /// <returns>Сокет, подключенный к следующему компьютеру в цепочке, либо null, если маршрут не удалось установить</returns> Socket TryConnect(Connection con, out Client targetHost, int mat) { NetworkStream nStream = new NetworkStream(con.Socket); byte[] buf = new byte[6]; nStream.Read(buf, 0, 6); targetHost = new Client(); targetHost.Deserialize(buf); foreach (Client c in targets) { if (c == targetHost) { nStream.WriteByte((byte)(IDT_Protocol.TerminateTransaction)); return null; } } Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { sock.Connect(targetHost.ip, targetHost.port); sock.Send(new byte[] { (byte)C_C_Protocol.Connect}); byte[] receive = new byte[2]; sock.Receive(receive, 0, 1, SocketFlags.None); sock.Receive(receive, 1, 1, SocketFlags.None); if((C_C_Protocol) receive[0] != C_C_Protocol.Connected || receive[1] ==0) { sock.Close(); throw new SocketException(); } sock.Send(new byte[] {(byte)C_C_Protocol.IsMaterial}); byte[] temp = bc.GetBytes(mat); sock.Send(temp); sock.Receive(temp, 1, SocketFlags.None); if (temp[0] != (byte)C_C_Protocol.MaterialResponse) { sock.Close(); throw new SocketException(); } return sock; } catch (SocketException) { foreach (Material m in ProgramMaterials.MaterialsArray) { foreach (Connection c in m.Connections) { IPAddress ip = ((IPEndPoint)c.Socket.RemoteEndPoint).Address; short port = (short)((IPEndPoint)c.Socket.RemoteEndPoint).Port; try { sock.Connect(ip, port); } catch (Exception) { continue; } return Connect(targetHost, mat); } } return null; } }
private void ReadClients(string filename) { FileStream fs = new FileStream(filename, FileMode.Open); Read: while (fs.Length > fs.Position) { byte[] temp = new byte[6]; fs.Read(temp, 0, 6); Client t = new Client(); t.Deserialize(temp); IPAddress IP_Client = t.ip; short Port_Client = t.port; IPEndPoint ip; for (int i = 0; i < connections.Count; i++) { ip = (IPEndPoint)(connections[i].Socket.RemoteEndPoint); if (ip.Address.ToString() == IP_Client.ToString()) goto Read; } Socket socket_download = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { Connection con = new Connection(); con.Thread = new Thread(Download); con.Thread.IsBackground = true; con.Socket = socket_download; con.Thread.Start(con); socket_download.Connect(new IPEndPoint(IP_Client, Port_Client)); } catch (SocketException) { /*if (Config.IDT_Enaibled) { Client cl = new Client(IP_Client, Port_Client); System.Threading.Thread th = new Thread(IDT_client); th.Start(cl); }*/ } } fs.Close(); }