/// <summary> /// Выдает таблицу клиентов /// </summary> /// <param name="nStream">Открытый сетевой поток</param> private void GetClientsTable(NetworkStream nStream) { byte[] temp = new byte[4]; nStream.Read(temp, 0, 4); int IdMaterial = bc.ToInt32(temp, 0); nStream.WriteByte((byte)CTE_Protocol.ReceiveClientsTable); foreach (Material m in ProgramMaterials.MaterialsArray) { if (m.IdMaterial == IdMaterial) { int number = m.Connections.Count; temp = bc.GetBytes(number); for (int i = 0; i < number; i++) { IPEndPoint ip = (IPEndPoint)m.Connections[i].Socket.RemoteEndPoint; Client cl = new Client(ip.Address, (short)ip.Port); temp = cl.Serialize(); nStream.Write(temp, 0, 6); } } } }
// методы работы с исходящим подключением /// <summary> /// Запускает процесс поиска маршрута /// </summary> /// <param name="target">Целевой компьютер</param> /// <param name="mat">Ид раздачи</param> /// <returns>Сокет, подключенный к следующему компьютеру в цепочке, либо null, если маршрут не удалось установить</returns> public Socket Connect(Client target, int mat) { foreach (Material m in ProgramMaterials.MaterialsArray) { foreach (Connection c in m.Connections) { try { IPAddress ip = ((IPEndPoint)c.Socket.RemoteEndPoint).Address; short port = 30095; Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { sock.Connect(ip, port); } catch (Exception) { continue; } NetworkStream comStr = new NetworkStream(sock); comStr.WriteByte((byte)IDT_Protocol.Connect); int resp = comStr.ReadByte(); if (resp != (int)IDT_Protocol.Connected) { TerminateConnection(comStr); continue; } byte[] temp = target.Serialize(); comStr.WriteByte((byte)IDT_Protocol.IsLink); comStr.Write(temp, 0, 6); resp = comStr.ReadByte(); if (resp != (int)IDT_Protocol.LinkAccesible) { TerminateConnection(comStr); continue; } comStr.WriteByte((byte)IDT_Protocol.IsMaterial); comStr.Write(bc.GetBytes(mat), 0, 4); IDT_Protocol res = (IDT_Protocol)comStr.ReadByte(); if (res == IDT_Protocol.MaterialNotFound) { comStr.WriteByte((byte)IDT_Protocol.TerminateTransaction); } return(sock); } catch (Exception) { continue; } } } return(null); }
// методы работы с исходящим подключением /// <summary> /// Запускает процесс поиска маршрута /// </summary> /// <param name="target">Целевой компьютер</param> /// <param name="mat">Ид раздачи</param> /// <returns>Сокет, подключенный к следующему компьютеру в цепочке, либо null, если маршрут не удалось установить</returns> public Socket Connect(Client target, int mat) { foreach (Material m in ProgramMaterials.MaterialsArray) { foreach (Connection c in m.Connections) { try { IPAddress ip = ((IPEndPoint)c.Socket.RemoteEndPoint).Address; short port = 30095; Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); try { sock.Connect(ip, port); } catch (Exception) { continue; } NetworkStream comStr = new NetworkStream(sock); comStr.WriteByte((byte)IDT_Protocol.Connect); int resp = comStr.ReadByte(); if(resp != (int)IDT_Protocol.Connected) { TerminateConnection(comStr); continue; } byte[] temp = target.Serialize(); comStr.WriteByte((byte)IDT_Protocol.IsLink); comStr.Write(temp, 0, 6); resp = comStr.ReadByte(); if(resp != (int)IDT_Protocol.LinkAccesible) { TerminateConnection(comStr); continue; } comStr.WriteByte((byte)IDT_Protocol.IsMaterial); comStr.Write(bc.GetBytes(mat), 0, 4); IDT_Protocol res = (IDT_Protocol)comStr.ReadByte(); if(res == IDT_Protocol.MaterialNotFound) comStr.WriteByte((byte)IDT_Protocol.TerminateTransaction); return sock; } catch (Exception) { continue; } } } return null; }
/// <summary> /// Выдает таблицу клиентов /// </summary> /// <param name="nStream">Открытый сетевой поток</param> private void GetClientsTable(NetworkStream nStream) { byte[] temp = new byte[4]; nStream.Read(temp, 0, 4); int IdMaterial = bc.ToInt32(temp, 0); nStream.WriteByte((byte)CTE_Protocol.ReceiveClientsTable); foreach (Material m in ProgramMaterials.MaterialsArray) { if (m.IdMaterial == IdMaterial) { int number = m.Connections.Count; temp = bc.GetBytes(number); for (int i = 0; i < number; i++) { IPEndPoint ip = (IPEndPoint) m.Connections[i].Socket.RemoteEndPoint; Client cl = new Client(ip.Address, (short)ip.Port); temp = cl.Serialize(); nStream.Write(temp, 0, 6); } } } }