コード例 #1
0
ファイル: Tools.cs プロジェクト: Denisa8/SOB
        public static void Send(NetworkStream stream, TransportObject ob, int timeout)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            var             tmp       = stream.WriteTimeout;

            stream.WriteTimeout = timeout;
            Exception exception = null;

            try { formatter.Serialize(stream, ob); } catch (Exception e) { exception = e; }
            stream.WriteTimeout = tmp;
            if (exception != null)
            {
                throw exception;
            }
        }
コード例 #2
0
ファイル: Tools.cs プロジェクト: Denisa8/SOB
        public static TransportObject Receive(Stream stream, int timeout)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            var             tmp       = stream.ReadTimeout;

            stream.ReadTimeout = timeout;
            TransportObject ob        = null;
            Exception       exception = null;

            try { ob = (TransportObject)formatter.Deserialize(stream); } catch (Exception e) { exception = e; }
            stream.ReadTimeout = tmp;
            if (exception != null)
            {
                throw exception;
            }
            return(ob);
        }
コード例 #3
0
ファイル: Peer.cs プロジェクト: Denisa8/SOB
 public void IncreaseErrorCounter(Guid GUID)
 {
     errorCounter++;
     if (errorCounter >= Settings.maxErrorCount)
     {
         Console.WriteLine("Banning peer: " + GUID);
         Program.bannedPeers.Add(GUID);
         var transportObject = new TransportObject(new BanPeer {
             BanID = GUID
         });
         Tools.Send(Program.clientTracker.GetStream(), transportObject);
     }
     else
     {
         Console.WriteLine("Received invalid message from " + GUID + " (" + errorCounter + "/" + Settings.maxErrorCount + ")");
     }
 }
コード例 #4
0
    protected override void Init()
    {
        SlotCount = 1;

        MaxInventorySlots = 0;
        MaxInventorySize = 0;

        MaxLaborers = 5;

        resource_id = 1001;

        TransportObject t;

        t = new TransportObject(1, 50);
        Transports.Add(t);

        t = new TransportObject(2, 30);
        Transports.Add(t);
    }
コード例 #5
0
ファイル: TransportDialog.cs プロジェクト: raimis001/RaGuild
    public override void SetBuilding(GameObject objectBuild)
    {
        TransportPanel.ClearItems();
        for (int i = 0; i < TransportBuilding.Transports.Count; i++) {

            GameObject obj = TransportPanel.AddItem();
            guiSlot slot = obj.GetComponent<guiSlot>();
                slot.Worker = new ResourceData(2001);
                slot.Type = guiSlot.SlotType.PROGRESS;
                slot.Drag = guiSlot.DragType.NONE;
                slot.Data = i;
                slot.OnSlotClick = OnTransportClick;
        }

        ResourceList.ClearItems();

        foreach (ResourceObject res in ResourceManager.ResourcesList.Values) {
            if (res.Type != ResourceTypes.RESOURCE) continue;

            GameObject obj = ResourceList.AddItem();
                obj.GetComponent<guiSlot>().Worker = new ResourceData(res.ID, 0);

        }

        BuildingList.ClearItems();

         GameObject[] buildings = GameObject.FindGameObjectsWithTag("building");
         foreach (GameObject obj in buildings) {
                GameObject created = BuildingList.AddItem();
                Building building = obj.GetComponent<Building>();

                created.GetComponent<guiSlot>().Worker = new ResourceData(building.resource_id);
                created.GetComponent<guiSlot>().Data = building.id;

                //guiBuildingSlot slot = created.GetComponent<guiBuildingSlot>();
                    //slot.id = building.id;
         }

         CurrentTransport = null;
         SelectedTransport.SetActive(false);
    }
コード例 #6
0
ファイル: TransportDialog.cs プロジェクト: raimis001/RaGuild
    void OnTransportClick(guiSlot slot)
    {
        CurrentSlot = (int)slot.Data;

        guiSlot s = TransportPanel.GetItem<guiSlot>(CurrentSlot);
        Debug.Log(s.ToString());

        CurrentTransport = TransportBuilding.Transports[CurrentSlot];

        AvalableList.ClearItems();
        for (int i = 0; i < CurrentTransport.Slots.Count; i++) {
            ResourceData data = CurrentTransport.Slots[i];
            GameObject obj = AvalableList.AddItem();
            guiSlot slt = obj.GetComponent<guiSlot>();
            slt.Data = i;
            slt.Type = guiSlot.SlotType.TEXT;
            slt.Drag = guiSlot.DragType.DROP;
            slt.Worker = data;
            slt.AddonText.text = data.amount > 0 ? data.amount.ToString() : "";
            slt.OnSlotEndDrag = AvailableEndDrag;
        }

        if (CurrentTransport.Source == null) {
            SourceSlot.Worker = new ResourceData();
        } else {
            SourceSlot.Worker = new ResourceData(CurrentTransport.Source.resource_id);
        }

        if (CurrentTransport.Destination == null) {
            DestinationSlot.Worker = new ResourceData();
        } else {
            DestinationSlot.Worker = new ResourceData(CurrentTransport.Destination.resource_id);
        }

        SelectedTransport.SetActive(true);

        //Debug.Log("Select transport id:" + CurrentTransport.ID);
    }
コード例 #7
0
ファイル: Tools.cs プロジェクト: Denisa8/SOB
 public static void Send(NetworkStream stream, TransportObject ob)
 {
     Send(stream, ob, Timeout.Infinite);
 }
コード例 #8
0
ファイル: Program.cs プロジェクト: Denisa8/SOB
        static async Task Main(string[] args)
        {
            CheckArguments(args);

            var filePath = Path.Combine(Environment.CurrentDirectory, "Downloads");

            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(filePath);
            }
            if (torrentsPath.EndsWith(".torrent", StringComparison.OrdinalIgnoreCase))
            {
                try
                {
                    #region pobranie danych z pliku torrent
                    var torrent = await Torrent.LoadAsync(torrentsPath);

                    if (torrent.AnnounceUrls != null)
                    {
                        Settings.torrentFileInfo.TrackerUrl = torrent.AnnounceUrls[0].FirstOrDefault();
                    }
                    TorrentFileInfo.TorrentHash  = torrent.InfoHash.GetHashCode();
                    TorrentFileInfo.PiecesLength = torrent.PieceLength;
                    TorrentFileInfo.PiecesCount  = torrent.Pieces.Count;
                    TorrentFileInfo.PieceHashes  = new byte[TorrentFileInfo.PiecesCount][];
                    //Settings.torrentFileInfo.ReadPieces =  //dołożyłam, aby sprawdzać, który kawałek dostaliśmy
                    Settings.torrentFileInfo.PathSource = PathSource;
                    Settings.torrentFileInfo.PathNew    = PathNew;
                    for (int i = 0; i < torrent.Pieces.Count; i++)
                    {
                        var byteResult = torrent.Pieces.ReadHash(i);
                        TorrentFileInfo.PieceHashes[i] = byteResult;
                    }
                    #endregion
                    #region Utworzenie peera
                    //peer = new Peer();
                    Settings.ReadPieces = new bool[TorrentFileInfo.PiecesCount];
                    EnablePeerConnections(Settings.port);
                    #endregion
                    #region Tracker
                    clientTracker = new TcpClient();
                    clientTracker.Connect(Settings.trackerIp, Settings.trackerPort);
                    Console.WriteLine("Connected to tracker");
                    var stream = clientTracker.GetStream();

                    List <int> pieces = new List <int>();
                    int        pc     = Settings.torrentFileInfo.GetSavedPiecesCount();

                    for (int i = 0; i < pc; i++)
                    {
                        Settings.ReadPieces[i] = true;
                        pieces.Add(i);
                    }

                    FileTorrent file = new FileTorrent(TorrentFileInfo.TorrentHash.ToString(), pieces, TorrentFileInfo.PiecesCount);
                    Files.TryAdd(TorrentFileInfo.TorrentHash.ToString(), file);


                    //for (int i = 0; i < torrent.Pieces.Count; i++) { pieces.Add(i); };
                    //FileTorrent file = new FileTorrent(TorrentFileInfo.TorrentHash.ToString(), pieces, pieces.Count);
                    //Files.TryAdd(TorrentFileInfo.TorrentHash.ToString(), file);


                    //if ((Settings.port == 1300)) // host na 1300 ma caly plik
                    //    for (int i = 0; i < Settings.ReadPieces.Length; i++)
                    //    {// TEMP
                    //        Settings.ReadPieces[i] = true;
                    //    }

                    InitConnectToTracker connSettings = new InitConnectToTracker(Settings.ID, Settings.peerIp, Settings.port, Files.ToDictionary(x => x.Key, x => x.Value), bannedPeers);
                    TransportObject      ob           = new TransportObject(connSettings);
                    ob.SendObject(stream);

                    //uruchamianie listenera
                    timerTracker = new Timer(async(o) => await ListenTracker(), null, Timeout.Infinite, Timeout.Infinite);
                    timerTracker.Change(0, Timeout.Infinite);
                    #endregion

                    #region wysylanie zapytan o kolejne czesci
                    new Thread(new ThreadStart(() =>
                    {
                        while (!Settings.isStopping)
                        {
                            if (Settings.availablePeer)
                            {
                                Thread.Sleep(5000);
                                Console.WriteLine("---- client.port: " + Settings.port);
                                Console.WriteLine("Having " + Settings.ReadPieces.Where(ffs => ffs == true).Count() + " pieces");

                                if (Settings.ReadPieces.Where(x => x == false).Count() == 0) // klient posiada wszystkie czesci
                                {
                                    Thread.Sleep(10000);                                     // narazie nie wiem co z tym zrobic. teraz jak wszystkie czesci sa pobrane to ten watek jest usypiany
                                    continue;
                                }
                                for (int i = 0; i < Settings.ReadPieces.Length;)
                                {
                                    if (Settings.ReadPieces[i] == false)
                                    {
                                        List <Peer> peersThatICanFinallySendRequestTo = new List <Peer>(); // Do tej listy zbierane sa wszystkie peery z danym kawalkiem
                                        foreach (ConnectedPeer connectedPeer in AvailablePeersOnTracker)
                                        {
                                            if (connectedPeer.Files.TryGetValue(TorrentFileInfo.TorrentHash.ToString(), out FileTorrent fileTorrent))
                                            {
                                                if (fileTorrent.Pieces.Contains(i)) // ustalenie czy dany peer ma kawalek
                                                {
                                                    foreach (KeyValuePair <int, Peer> pair in Peers)
                                                    {
                                                        if (((pair.Value.GUID == connectedPeer.ID) && (!bannedPeers.Contains(pair.Value.GUID)) && (!pair.Value.PieceRequestSent.Contains(i))))
                                                        {
                                                            peersThatICanFinallySendRequestTo.Add(pair.Value);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if (peersThatICanFinallySendRequestTo.Count == 0) // jesli nie ma zadnych dostepnych peerow
                                        {
                                            //Console.WriteLine("No peers with needed piece");
                                            var x = (DateTime.Now - LastSentRequest).TotalMinutes;
                                            if (x > 2)                                        // oraz ostatni request zostal wyslany 2 minuty temu
                                            {
                                                foreach (KeyValuePair <int, Peer> p in Peers) // resetuj status wyslania requestu o czesc u kazdego polaczonego peera
                                                {
                                                    if (p.Value.PieceRequestSent.Contains(i))
                                                    {
                                                        p.Value.PieceRequestSent.Remove(i);
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            Random r  = new Random();
                                            var index = r.Next(peersThatICanFinallySendRequestTo.Count);
                                            Console.WriteLine("Sending request to peer with index: " + index + " for piece: " + i);
                                            peersThatICanFinallySendRequestTo[index].SendMessage(i); // wysylanie zapytania do losowego peera z listy, zeby rozkladac ruch
                                            peersThatICanFinallySendRequestTo[index].PieceRequestSent.Add(i);
                                            LastSentRequest = DateTime.Now;
                                        }
                                        if (Settings.ReadPieces[i] == true)
                                        {
                                            Console.WriteLine("Piece " + i + " aquired. Moving to the next piece.");
                                            i++;
                                        }
                                    }
                                    else
                                    {
                                        i++;
                                    }
                                }
                            }
                        }
                    })).Start();
                    #endregion
                    # region przetwarzanie zapytan wychodzacych
                    new Thread(new ThreadStart(() =>
                    {
                        while (!Settings.isStopping)
                        {
                            if (Settings.availablePeer)
                            {
                                if (Outgoing.Count == 0)
                                {
                                    Thread.Sleep(1000);
                                    continue;
                                }
                                var pendingMessage = Outgoing[0];
                                Console.WriteLine("Sending ID: " + pendingMessage.PieceIndex + " from outgoing.");
                                pendingMessage.Send();
                                Outgoing.Remove(pendingMessage);
                            }
                        }
                    })).Start();
                    #endregion
                    #region przetwarzanie przychodzacych wiadomosci
                    new Thread(new ThreadStart(() =>
                    {
                        while (!Settings.isStopping)
                        {
                            if (Settings.availablePeer)
                            {
                                Console.WriteLine("Incoming.Count = " + Incoming.Count);
                                if (Incoming.Count == 0)
                                {
                                    Thread.Sleep(5000);
                                    continue;
                                }

                                var pendingMessage = Incoming[0];
                                if (bannedPeers.Contains(pendingMessage.Guid))
                                {
                                    Incoming.Remove(pendingMessage);
                                    continue;
                                }
                                if (pendingMessage.Type == 1)
                                {
                                    Console.WriteLine("Got piece with index: " + pendingMessage.PieceIndex);
                                    int id = EndianBitConverter.Big.ToInt32(pendingMessage.EncodedMessage, 0); //tutaj masz, który kawałek Ci przyszedł
                                    if (Settings.ReadPieces[pendingMessage.PieceIndex] == true)                // jesli juz mamy taka czesc to zignorowac wiadomosc
                                    {
                                        Console.WriteLine(pendingMessage.PieceIndex + " --- Got it");
                                        Incoming.Remove(pendingMessage);
                                    }
                                    else
                                    {
                                        //  Console.WriteLine("Saving piece: " + pendingMessage.PieceIndex + " from incoming");
                                        Settings.torrentFileInfo.WriteFilePiece(pendingMessage.PieceIndex, pendingMessage.EncodedMessage);
                                        Settings.ReadPieces[pendingMessage.PieceIndex] = true;

                                        //  Console.WriteLine("Wysylanie na tracker ze otrzymano " + pendingMessage.PieceIndex + "czesc pliku " + torrent.Name);
                                        var receivePieceFile = new ReceivePieceFile(TorrentFileInfo.TorrentHash.ToString(), pendingMessage.PieceIndex);
                                        Tools.Send(clientTracker.GetStream(), new TransportObject((object)receivePieceFile));
                                        Incoming.Remove(pendingMessage);
                                    }
                                }
                                else if (pendingMessage.Type == 0)
                                {
                                    byte[] encodedMessage;
                                    Console.WriteLine("Got request for piece: " + pendingMessage.PieceIndex);
                                    if (Settings.sendCorrectData)
                                    {
                                        encodedMessage = Peer.EncodePiece(Settings.torrentFileInfo.ReadFilePiece(pendingMessage.PieceIndex), 1);// wczytaj piece jako tablice bajtow);
                                    }
                                    else
                                    {
                                        encodedMessage = Peer.EncodeWrongPiece(pendingMessage.PieceIndex, 1);// wczytaj piece jako tablice bajtow);
                                        Console.WriteLine("Wysyłanie błędnej wiadomości");
                                    }
                                    Outgoing.Add(new PendingMessage
                                    {
                                        PieceIndex     = pendingMessage.PieceIndex,
                                        EncodedMessage = encodedMessage,
                                        Stream         = pendingMessage.Stream,
                                        Type           = 1
                                    });

                                    Console.WriteLine("Saving piece: " + pendingMessage.PieceIndex + " to outgoing");

                                    Incoming.Remove(pendingMessage);
                                }
                                else if (pendingMessage.Type == 2)
                                {
                                    Outgoing.Add(new PendingMessage
                                    {
                                        EncodedMessage = Peer.EncodeGUIDResponse(pendingMessage.IndexPeer),
                                        Type           = 3,
                                        Stream         = pendingMessage.Stream,
                                        IndexPeer      = pendingMessage.IndexPeer
                                    });
                                    Incoming.Remove(pendingMessage);
                                }
                                else if (pendingMessage.Type == 3)
                                {
                                    bool success = false;

                                    foreach (KeyValuePair <int, Peer> peer in Peers)
                                    {
                                        if (peer.Key == pendingMessage.IndexPeer)
                                        {
                                            peer.Value.GUID = pendingMessage.Guid;
                                            success         = true;
                                            break;
                                        }
                                    }
                                    if (!success)
                                    {
                                        Console.WriteLine("Couldnt save GUID");
                                    }

                                    Incoming.Remove(pendingMessage);
                                }
                                else
                                {
                                    Console.WriteLine("Odebrano niepoprawna wiadomosc");
                                }
                                Incoming.Remove(pendingMessage);
                            }
                        }
                    })).Start();
                    #endregion
                    #region zarzadzanie peerami
                    new Thread(new ThreadStart(() =>
                    {
                        while (!Settings.isStopping)
                        {
                            Thread.Sleep(5000);
                            var peers = Peers.ToList();
                            foreach (KeyValuePair <int, Peer> peer in peers)
                            {
                                var lastActiveInMinutes = DateTime.Now - peer.Value.LastActive;
                                if (lastActiveInMinutes.TotalMinutes > Settings.peerTimeoutInMinutes) // jezeli peer jest nieaktywny przez zadany czas
                                {
                                    Console.WriteLine("peer " + peer.Value.GUID + " timed out");
                                    if (Peers.TryRemove(peer.Key, out Peer p))
                                    {
                                        peer.Value.Disconnect(); // rozlacz peera
                                        Console.WriteLine("peer " + p.GUID + " disconnected");
                                    }
                                }
                            }
                        }
                    })).Start();
                    #endregion
                    while (true)
                    {
                    }
                    //p1.ConnectToPeer(1301);
                    //while (!peer.IsConnected && !Peers.Any()) { }
                    //for (int i = 0; i < torrent.Pieces.Count; i++)
                    //{
                    //  var byteResult = torrent.Pieces.ReadHash(i);
                    //  torrentFileInfo.PieceHashes[i] = byteResult;
                    //  Piece p = torrentFileInfo.ReadFilePiece(i);

                    //  if (p == null)
                    //    continue;
                    //  peer.SendPiece(p);
                    //  Thread.Sleep(250);
                    //  //torrentFileInfo.WriteFilePiece(i,p.data);
                    //}
                    Console.ReadLine();
                    clientTracker.Close();
                }