Exemplo n.º 1
0
 private static void SendToEveryone(string message, Client sender)
 {
     lock (lck)
     {
         foreach (var connection1 in Connections)
         {
             if (!Equals(connection1, sender))
             {
                 TcpSocketHelper.SendString(connection1.Socket, message);
             }
         }
     }
 }
        public bool TryConnectToPeer(Peer peer, EventHandler <PeerEventArgs> eventHandler = null)
        {
            lock (peerLock)
            {
                if (IsPeerConnected(peer))
                {
                    return(false);
                }

                if (_peers.Count + PendingPeers.Count >= Constants.MaxPeers)
                {
                    return(false);
                }

                PendingPeers.Add(peer);
            }

            if (!TcpSocketHelper.TryEstablishConnection(peer.Ip, peer.Port, out Socket socket))
            {
                lock (peerLock)
                {
                    PendingPeers.Remove(peer);
                    return(false);
                }
            }

            var socketPeer = new SocketPeer(PeerEventDataFactory, peer, socket, TorrentInfo, PeerId);

            if (!socketPeer.TryInitiateHandsake())
            {
                PendingPeers.Remove(peer);
                DisconnectPeer(socketPeer);
                return(false);
            }

            socketPeer.PeerEventHandler += OnPeerEvent;
            socketPeer.PeerEventHandler += eventHandler;
            lock (peerLock)
            {
                _peers.Add(socketPeer);
                PendingPeers.Remove(peer);
            }

            socketPeer.StartReceive();

            return(true);
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            Console.InputEncoding  = Encoding.Unicode;
            Console.OutputEncoding = Encoding.Unicode;

            Console.WriteLine("Hello client!");
            Console.WriteLine("Say me you name!");
            Console.Write("Name: ");
            name = Console.ReadLine();
            Console.WriteLine("Please enter Server ip and port!");
            Console.Write("IP: ");
            string ip = Console.ReadLine();

            Console.Write("Port: ");
            int port = int.Parse(Console.ReadLine() ?? string.Empty);

            server = new IPEndPoint(IPAddress.Parse(ip ?? string.Empty), port);

            socket = TcpSocketHelper.CreateSocket();

            try
            {
                socket = TcpSocketHelper.CreateSocket();
                socket.Connect(server);

                Task listeningTask = Listen();

                TcpSocketHelper.SendString(socket, name);

                while (true)
                {
                    string message = Console.ReadLine();

                    TcpSocketHelper.SendString(socket, $"{message}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Close();
            }
        }
Exemplo n.º 4
0
        private static async Task Receive(Client client)
        {
            await Task.Run(() =>
            {
                client.Name = TcpSocketHelper.ReceiveString(client.Socket);


                string message = $"{client.Name} connected!";
                Console.WriteLine($"{DateTime.Now}: {message}");

                SendToEveryone(message, client);

                while (true)
                {
                    try
                    {
                        string str = TcpSocketHelper.ReceiveString(client.Socket);
                        Console.WriteLine($"{DateTime.Now}: {client.Name}: {str}");

                        message = $"{client.Name}: {str}";

                        SendToEveryone(message, client);
                    }
                    catch (Exception e)
                    {
                        message = $"{client.Name} disconnected!";

                        Console.WriteLine($"{DateTime.Now}: {message}");

                        Connections.Remove(client);

                        SendToEveryone(message, client);

                        client.Socket.Shutdown(SocketShutdown.Both);
                        client.Socket.Close();
                        return;
                    }
                }
            });
        }
Exemplo n.º 5
0
        private static async Task Listen()
        {
            await Task.Run((() =>
            {
                try
                {
                    while (true)
                    {
                        var str = TcpSocketHelper.ReceiveString(socket);

                        Console.WriteLine(str);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    Close();
                }
            }));
        }
Exemplo n.º 6
0
        static void Main(string[] args)
        {
            Console.InputEncoding  = Encoding.Unicode;
            Console.OutputEncoding = Encoding.Unicode;

            Console.WriteLine("Hello server!");
            //Console.Write("Port: ");
            //int port = int.Parse(Console.ReadLine() ?? string.Empty);
            int port = 57650;

            Console.WriteLine($"Your ip is {UsefulThings.GetPublicIpAddress()}:{port}");
            Socket   socket        = TcpSocketHelper.CreateSocket();
            EndPoint localEndPoint = TcpSocketHelper.BindSocket(socket, IPAddress.Loopback, port);

            socket.Listen(10);

            while (true)
            {
                Client client = new Client();
                client.Socket = socket.Accept();
                Connections.Add(client);
                Task task = Receive(client);
            }
        }
Exemplo n.º 7
0
        static void Main(string[] args)
        {
            if (args.Length != 3)
            {
                Console.Error.WriteLine($"You must pass 3 arguments: Path to torrent, Download directory, Port (Range: [{Constants.MinPortNumber}:{Constants.MaxPortNumber}])");
                return;
            }

            var torrentPath = args[0];

            if (!File.Exists(torrentPath))
            {
                Console.Error.WriteLine("Passed torrent does not exist");
                return;
            }

            var saveDir = args[1];

            if (!int.TryParse(args[2], out int port))
            {
                Console.Error.WriteLine("Invalid port int passed");
                return;
            }

            if (port > Constants.MaxPortNumber || port < Constants.MinPortNumber)
            {
                Console.Error.WriteLine($"Port must be in range: [{Constants.MinPortNumber}:{Constants.MaxPortNumber}]");
                return;
            }

            var peerId                 = "-ZA0001-000000000001";
            var bencodeParser          = new BencodeParser();
            var httpClient             = new HttpClientHelper();
            var tcpSocketHelper        = new TcpSocketHelper();
            var torrentFactory         = new TorrentFactory(bencodeParser);
            var trackerResponseFactory = new TrackerResponseFactory(bencodeParser);
            var peerEventDataFactory   = new PeerEventDataFactory();

            var torrentClient = new BitTorrentDownloader(peerId, bencodeParser, httpClient, tcpSocketHelper,
                                                         torrentFactory, trackerResponseFactory, peerEventDataFactory);

            torrentClient.PeerEventHandlerEcho += OnPeerEvent;
            var torrentThread = new Thread(() => torrentClient.DownloadTorrent(torrentPath, saveDir, port));

            torrentThread.Start();

            Console.Write("Downloading file... ");
            using (var progress = new ProgressBar(40))
            {
                while (!torrentClient.IsDownloadCompleted)
                {
                    Thread.Sleep(Constants.UpdateClockMs);
                    var pieces = torrentClient.Pieces;
                    if (pieces.Count == 0)
                    {
                        continue;
                    }

                    var completedPieces = pieces.Count - torrentClient.GetNonCompletedPieces().Count;
                    progress.Report((double)completedPieces / pieces.Count);
                }

                progress.Report(1);
            }

            Console.WriteLine("Done downloading file");
            Console.WriteLine("Press any key to continue...");
            Console.ReadLine();
        }