Exemple #1
0
        /// <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);
                    }
                }
            }
        }
Exemple #2
0
// методы работы с исходящим подключением


        /// <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);
        }
Exemple #3
0
        // методы работы с исходящим подключением
        /// <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;
        }
Exemple #4
0
        /// <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);
                    }
                }
            }
        }