Inheritance: DhtSource
Beispiel #1
0
        public static int SendtoAddress(DhtNetwork network, RudpAddress target, RudpPacket packet)
        {
            Debug.Assert(packet.Payload != null || packet.PacketType == RudpPacketType.LightAck);

            int sentBytes = 0;

            // same code used in rudpSocket
            if (network.Core.Firewall != FirewallType.Blocked && target.LocalProxy == null)
            {
                sentBytes = network.SendPacket(target.Address, packet);
            }

            else if (target.Address.TunnelClient != null)
            {
                sentBytes = network.SendTunnelPacket(target.Address, packet);
            }

            else
            {
                packet.ToAddress = target.Address;

                TcpConnect proxy = network.TcpControl.GetProxy(target.LocalProxy);

                if (proxy != null)
                {
                    sentBytes = proxy.SendPacket(packet);
                }
                else
                {
                    sentBytes = network.TcpControl.SendRandomProxy(packet);
                }
            }

            return(sentBytes);
        }
Beispiel #2
0
        public void Send_ProxyUpdate(TcpConnect tcp)
        {
            //crit handle special if tcp is global

            ProxyUpdate update = new ProxyUpdate();

            update.Proxy = new DhtAddress(tcp.RemoteIP, tcp);

            Log("Sent Proxy Update (" + update.Proxy + ")");

            SendPacket(update);
        }
Beispiel #3
0
        public void AddProxy(TcpConnect socket)
        {
            if (ProxyMap.ContainsKey(socket.RoutingID))
                return;

            ProxyMap[socket.RoutingID] = socket;

            if (socket.Proxy == ProxyType.Server)
                ProxyServers.Add(socket);
            else
                ProxyClients.Add(socket);
        }
Beispiel #4
0
        public void SendPacket(RudpPacket packet, RudpAddress target)
        {
            Debug.Assert(packet.Payload != null);

            // sending syn  to (tracked target) through (address target) udp / tcp

            /*string log = "Sending " + tracked.Packet.PacketType.ToString();
             * if (tracked.Packet.Ident != 0) log  += ", ID " + tracked.Packet.Ident.ToString();
             * log +=  " to " + Utilities.IDtoBin(tracked.Packet.TargetID).Substring(0, 10);
             * log += " target address " + target.Address.ToString();*/

            int sentBytes = 0;

            // same code used in lightComm
            if (Core.Firewall != FirewallType.Blocked && target.LocalProxy == null)
            {
                sentBytes = Network.SendPacket(target.Address, packet);
            }

            else if (target.Address.TunnelClient != null)
            {
                sentBytes = Network.SendTunnelPacket(target.Address, packet);
            }

            else
            {
                packet.ToAddress = target.Address;

                TcpConnect proxy = Network.TcpControl.GetProxy(target.LocalProxy);

                if (proxy != null)
                {
                    sentBytes = proxy.SendPacket(packet);
                }
                else
                {
                    sentBytes = Network.TcpControl.SendRandomProxy(packet);
                }

                //log += " proxied by local tcp";
            }

            Bandwidth.OutPerSec += sentBytes;

            //Session.Log(log);
        }
Beispiel #5
0
        public void AddProxy(TcpConnect socket)
        {
            if (ProxyMap.ContainsKey(socket.RoutingID))
            {
                return;
            }

            ProxyMap[socket.RoutingID] = socket;

            if (socket.Proxy == ProxyType.Server)
            {
                ProxyServers.Add(socket);
            }
            else
            {
                ProxyClients.Add(socket);
            }
        }
Beispiel #6
0
        public TcpConnect OnAccept(Socket socket, IPEndPoint source)
        {
            TcpConnect inbound = new TcpConnect(this);

            inbound.TcpSocket = socket;
            inbound.RemoteIP  = source.Address;
            inbound.TcpPort   = (ushort)source.Port; // zero if internet, actual value if sim
            inbound.SetConnected();

            // it's not until the host sends us traffic that we can send traffic back because we don't know
            // connecting node's dhtID (and hence encryption key) until ping is sent

            lock (SocketList)
                SocketList.Add(inbound);

            Network.UpdateLog("Tcp", "Accepted Connection from " + inbound.ToString());

            return(inbound);
        }
Beispiel #7
0
        public void AnnounceProxy(TcpConnect tcp)
        {
            Debug.Assert(!Network.IsLookup);

            // function run bewteen cores
            if (Network.Core.InvokeRequired)
            {
                Network.Core.RunInCoreAsync(delegate() { AnnounceProxy(tcp); });
                return;
            }

            foreach (RudpSession session in SessionMap.Values)
            {
                if (session.Status == SessionStatus.Active)
                {
                    session.Send_ProxyUpdate(tcp);
                }
            }
        }
Beispiel #8
0
        void CheckProxies(ProxyType type, int max)
        {
            /*if (type == ProxyType.Server && Core.Sim.RealFirewall != FirewallType.Open)
             * {
             *  int x = 0;
             *  // count number of connected servers, if too many break
             *  foreach (TcpConnect connection in SocketList)
             *      if (connection.Proxy == type)
             *          x++;
             *  if (x > 2)
             *  {
             *      int y = 0;
             *      y++;
             *  }
             * }*/

            TcpConnect furthest = null;
            UInt64     distance = 0;
            int        count    = 0;

            lock (SocketList)
                foreach (TcpConnect connection in SocketList)
                {
                    if (connection.State == TcpState.Connected && connection.Proxy == type)
                    {
                        count++;

                        if ((connection.UserID ^ Network.Local.UserID) > distance)
                        {
                            distance = connection.UserID ^ Network.Local.UserID;
                            furthest = connection;
                        }
                    }
                }

            // greater than max, disconnect furthest
            if (count > max && furthest != null)
            {
                furthest.CleanClose("Too many proxies, disconnecting furthest");
            }
        }
Beispiel #9
0
        public void MakeOutbound(DhtAddress address, ushort tcpPort, string reason)
        {
            try
            {
                int connecting = 0;

                // check if already connected
                lock (SocketList)
                    foreach (TcpConnect socket in SocketList)
                    {
                        if (socket.State == TcpState.Connecting)
                        {
                            connecting++;
                        }

                        if (socket.State != TcpState.Closed &&
                            address.IP.Equals(socket.RemoteIP) &&
                            tcpPort == socket.TcpPort &&
                            socket.Outbound) // allows check firewall to work
                        {
                            return;
                        }
                    }

                if (connecting > 6)
                {
                    Debug.Assert(true);
                    return;
                }

                TcpConnect outbound = new TcpConnect(this, address, tcpPort);
                Network.UpdateLog("Tcp", "Attempting Connection to " + address.ToString() + ":" + tcpPort.ToString() + " (" + reason + ")");

                lock (SocketList)
                    SocketList.Add(outbound);
            }
            catch (Exception ex)
            {
                Network.UpdateLog("Exception", "TcpHandler::MakeOutbound: " + ex.Message);
            }
        }
Beispiel #10
0
        public void AnnounceProxy(TcpConnect tcp)
        {
            Debug.Assert(!Network.IsLookup);

            // function run bewteen cores
            if (Network.Core.InvokeRequired)
            {
                Network.Core.RunInCoreAsync(delegate() { AnnounceProxy(tcp); });
                return;
            }

            foreach (RudpSession session in SessionMap.Values)
                if (session.Status == SessionStatus.Active)
                    session.Send_ProxyUpdate(tcp);
        }
Beispiel #11
0
        public void MakeOutbound( DhtAddress address, ushort tcpPort, string reason)
        {
            try
            {
                int connecting = 0;

                // check if already connected
                lock(SocketList)
                    foreach (TcpConnect socket in SocketList)
                    {
                        if (socket.State == TcpState.Connecting)
                            connecting++;

                        if (socket.State != TcpState.Closed &&
                            address.IP.Equals(socket.RemoteIP) &&
                            tcpPort == socket.TcpPort &&
                            socket.Outbound) // allows check firewall to work
                            return;
                    }

                if (connecting > 6)
                {
                    Debug.Assert(true);
                    return;
                }

                TcpConnect outbound = new TcpConnect(this, address, tcpPort);
                Network.UpdateLog("Tcp", "Attempting Connection to " + address.ToString() + ":" + tcpPort.ToString() + " (" + reason + ")");

                lock(SocketList)
                    SocketList.Add(outbound);
            }
            catch(Exception ex)
            {
                Network.UpdateLog("Exception", "TcpHandler::MakeOutbound: " + ex.Message);
            }
        }
Beispiel #12
0
 public SimPacket(SimPacketType type, IPEndPoint source, byte[] packet, DhtNetwork dest, TcpConnect tcp, ulong id)
 {
     Type = type;
     Source = source;
     Packet = packet;
     Dest = dest;
     Tcp = tcp;
     SenderID = id;
 }
Beispiel #13
0
        public int SendPacket(SimPacketType type, DhtNetwork network, byte[] packet, System.Net.IPEndPoint target, TcpConnect tcp)
        {
            if (type == SimPacketType.Tcp)
                if (!TcpEndPoints.ContainsKey(target))
                {
                    //this is what actually happens -> throw new Exception("Disconnected");
                    return -1;
                }

            if( !UdpEndPoints.ContainsKey(target) ||
                !SimMap.ContainsKey(target.Address) ||
                !SimMap.ContainsKey(network.Core.Sim.RealIP))
                return 0;

            DhtNetwork targetNet = (type == SimPacketType.Tcp) ? TcpEndPoints[target] : UdpEndPoints[target];
            if (network.IsLookup != targetNet.IsLookup)
                Debug.Assert(false);

            IPEndPoint source = new IPEndPoint(network.Core.Sim.RealIP, 0);
            source.Port = (type == SimPacketType.Udp) ? network.UdpControl.ListenPort : network.TcpControl.ListenPort;

            SimInstance sourceInstance = SimMap[source.Address];
            SimInstance destInstance   = SimMap[target.Address];

            if(packet != null)
                sourceInstance.BytesSent += (ulong)packet.Length;

            // tcp connection must be present to send tcp
            if (type == SimPacketType.Tcp)
                if( !TcpSourcetoDest.SafeContainsKey(tcp))
                {
                    //this is what actually happens -> throw new Exception("Disconnected");
                    return -1;
                }

            // add destination to nat table
            if (type == SimPacketType.Udp && sourceInstance.RealFirewall == FirewallType.NAT)
                sourceInstance.NatTable[target] = true;

            // if destination blocked drop udp / tcp connect requests
            if (destInstance.RealFirewall == FirewallType.Blocked)
            {
                if (type == SimPacketType.Udp || type == SimPacketType.TcpConnect)
                    return 0;
            }

            // if destination natted drop udp (unless in nat table) / tcp connect requests
            else if (destInstance.RealFirewall == FirewallType.NAT)
            {
                if (type == SimPacketType.TcpConnect)
                    return 0;

                if (type == SimPacketType.Udp && !destInstance.NatTable.ContainsKey(source) )
                    return 0;
            }

            // randomly test tcp send buffer full
            if(TestTcpFullBuffer)
                if (type == SimPacketType.Tcp && packet.Length > 4 && RndGen.Next(2) == 1)
                {
                    int newlength = packet.Length / 2;
                    byte[] newpacket = new byte[newlength];
                    Buffer.BlockCopy(packet, 0, newpacket, 0, newlength);
                    packet = newpacket;
                }

            if (packet != null && packet.Length == 0)
                Debug.Assert(false, "Empty Packet");

            int index = destInstance.ThreadIndex;
            lock (OutPackets[index])
                OutPackets[index].Add(new SimPacket(type, source, packet, targetNet, tcp, network.Local.UserID));

            if (packet == null)
                return 0;

            return packet.Length;
        }
Beispiel #14
0
        public bool Activate()
        {
            // bootstrap search from routing
            foreach(DhtContact contact in Network.Routing.Find(TargetID, 8))
                Add(contact);

            List<TcpConnect> sockets = null;

            // if open send search to proxied nodes just for good measure, probably helps on very small networks
            if (Core.Firewall == FirewallType.Open)
                sockets = Network.TcpControl.ProxyClients;

            // if natted send request to proxies for fresh nodes
            if(Core.Firewall == FirewallType.NAT)
                sockets = Network.TcpControl.ProxyServers;

            if(sockets != null)
                foreach (TcpConnect socket in sockets)
                {
                    DhtContact contact = new DhtContact(socket, socket.RemoteIP);
                    Network.Searches.SendRequest(contact, TargetID, SearchID, Service, DataType, Parameters);

                    DhtLookup host = Add(socket.GetContact());
                    if (host != null)
                        host.Status = LookupStatus.Searching;
                }

            // if blocked send proxy search request to 1 proxy, record and wait
            if (Core.Firewall == FirewallType.Blocked && !Network.UseLookupProxies)
            {
                // pick random proxy server
                if (Network.TcpControl.ProxyServers.Count == 0)
                    return false;

                ProxyTcp = Network.TcpControl.ProxyServers[Core.RndGen.Next(Network.TcpControl.ProxyServers.Count)];

                Send_ProxySearchRequest();
            }

            return true;
        }
Beispiel #15
0
 public RudpAddress(DhtAddress address, TcpConnect proxy)
 {
     Address    = address;
     LocalProxy = new DhtClient(proxy);
 }
Beispiel #16
0
        public int SendRandomProxy(G2Packet packet)
        {
            TcpConnect socket = GetRandomProxy();

            return((socket != null) ? socket.SendPacket(packet) : 0);
        }
Beispiel #17
0
        public TcpConnect OnAccept(Socket socket, IPEndPoint source)
        {
            TcpConnect inbound = new TcpConnect(this);

            inbound.TcpSocket = socket;
            inbound.RemoteIP = source.Address;
            inbound.TcpPort = (ushort)source.Port;  // zero if internet, actual value if sim
            inbound.SetConnected();

            // it's not until the host sends us traffic that we can send traffic back because we don't know
            // connecting node's dhtID (and hence encryption key) until ping is sent

            lock (SocketList)
                SocketList.Add(inbound);

            Network.UpdateLog("Tcp", "Accepted Connection from " + inbound.ToString());

            return inbound;
        }
Beispiel #18
0
 public RudpAddress(DhtAddress address, TcpConnect proxy)
 {
     Address = address;
     LocalProxy = new DhtClient(proxy);
 }