コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
ファイル: Material.cs プロジェクト: Andry75/Tracker-p2p
        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();
        }
コード例 #3
0
ファイル: IDT.cs プロジェクト: yaroslavchuvaev/p2p
        /// <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;
            }
        }
コード例 #4
0
ファイル: Material.cs プロジェクト: yaroslavchuvaev/p2p
        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();
        }