// Actually checks to see if data can go to the internet (via UDP 53)
    private void DoCheckDNSNetwork(object oIn)
    {
        try
        {
            StateManager CurState = (StateManager)oIn;

            byte[] bIDOut = new byte[8];

            // First, try a DNS ping through proxy (whether it's on or not)
            EDNSPacket Packet = SendUdpNetworkPacket(g_sProxyIP, g_sIDIP, 53, 0x10, false, bIDOut);

            DNSPacket.PacketExplode pe = new DNSPacket.PacketExplode(Packet.GetResponsePacket());

            // Retry over TCP if truncated
            if (pe.IsTruncated())
            {
                Packet = SendTcpNetworkPacket(g_sProxyIP, g_sIDIP, 53, 0x10, false, bIDOut);
            }

            if (Packet.GetResponsePacket().Length > 0)
            {
                // We got a result through the proxy; all is well
                CurState.SetEncryptedState(true);
                CurState.SetNetworkState(true, true);
            }
            else
            {
                // We did not get a response through the proxy, so encryption is a no-go
                CurState.SetEncryptedState(false);

                // Try a second DNS ping, this time through the OpenDNS resolver
                Packet = SendUdpNetworkPacket(g_sResolverIP, g_sIDIP, 53, 0x10, false, bIDOut);
                if (Packet.GetResponsePacket().Length > 0)
                {
                    // We have at least SOME internet connection
                    CurState.SetNetworkState(true, true);
                }
                else
                {
                    // We could not reach the network at all
                    CurState.SetNetworkState(false, true);
                }
            }
        }
        catch (Exception Ex)
        {
            // Do nothing
        }
    }
Esempio n. 2
0
    // Actually builds, sends, sets the received bytes and returns the whole packet
    private EDNSPacket SendUdpNetworkPacket(string sDNSIP, string sIPToResolve, int nPort, byte bType, bool bEDNS, byte[] bMachine_ID)
    {
        // Create empty EDNS packet
        EDNSPacket Packet = new EDNSPacket();

        try
        {
            IPEndPoint Endpoint = new IPEndPoint(IPAddress.Parse(sDNSIP), nPort);

            // Send the current machine_id host
            if (bEDNS)
                Packet.CreateEDNSPacketMachineID(sIPToResolve, bType, bMachine_ID);
            else
                Packet.CreateDNSPacket(sIPToResolve, bType);

            if (Packet.GetPacketLen() > 0)
            {
                // Create a udp client to send the packet
                UdpClient udpGo = new UdpClient();
                udpGo.Client.SendTimeout = 2000;
                udpGo.Client.ReceiveTimeout = 2000;
                udpGo.Send(Packet.GetPacket(), Packet.GetPacket().Length, Endpoint);

                //IPEndPoint object will allow us to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

                // Launch Asynchronous
                IAsyncResult iarResult = udpGo.BeginReceive(null, null);

                // Wait until complete
                bool bKill = false;
                DateTime dtTimeStart = DateTime.Now;
                while (iarResult.IsCompleted == false)
                {
                    // Sleep instead of cycling
                    System.Threading.Thread.Sleep(100);

                    // Watchdog, if doesn't return in 5 seconds get out
                    if (dtTimeStart.AddSeconds(5) < DateTime.Now)
                    {
                        bKill = true;
                        break;
                    }
                }

                // This can hang when not happy about a broken connection
                if (bKill)
                    udpGo.Close();
                else
                    Packet.SetReceivePacket(udpGo.EndReceive(iarResult, ref RemoteIpEndPoint));
            }
        }
        catch (Exception Ex)
        {
            // TODO: Log an exception?
        }

        // Always just return packet
        return Packet;
    }
Esempio n. 3
0
    // Actually builds, sends, sets the received bytes and returns the whole packet
    private EDNSPacket SendTcpNetworkPacket(string sDNSIP, string sIPToResolve, int nPort, byte bType, bool bEDNS, byte[] bMachine_ID)
    {
        // Create empty EDNS packet
        EDNSPacket Packet = new EDNSPacket();

        try
        {
            // Send the current machine_id host
            if (bEDNS)
                Packet.CreateEDNSPacketMachineID(sIPToResolve, bType, bMachine_ID);
            else
                Packet.CreateDNSPacket(sIPToResolve, bType);

            if (Packet.GetPacketLen() > 0)
            {
                // Create a tcp client to send the packet
                TcpClient tcpGo = new TcpClient(sDNSIP, nPort);
                NetworkStream tcpStream = tcpGo.GetStream();
                byte[] packetBytes = Packet.GetPacket();

                // Get length bytes in network byte order
                byte[] lengthBytes = BitConverter.GetBytes((short)packetBytes.Length);
                if (BitConverter.IsLittleEndian) Array.Reverse(lengthBytes);

                // Prepend the length to the existing data; TCP DNS seems to require this
                byte[] sendBytes = new byte[packetBytes.Length + 2];
                Buffer.BlockCopy(lengthBytes, 0, sendBytes, 0, lengthBytes.Length);
                Buffer.BlockCopy(packetBytes, 0, sendBytes, 2, packetBytes.Length);

                tcpStream.Write(sendBytes, 0, sendBytes .Length);

                // Get the response synchronously (hopefully smaller than 2048)
                byte[] receiveBuffer = new byte[2048];

                int bytesRead = tcpStream.Read(packetBytes, 0, packetBytes.Length);
                if (bytesRead > 0)
                {
                    // Trim off that extra length before returning the packet
                    byte[] buffTrimmed = new byte[bytesRead - 2];
                    Buffer.BlockCopy(receiveBuffer, 2, buffTrimmed, 0, bytesRead - 2);

                    Packet.SetReceivePacket(buffTrimmed);
                }

                tcpStream.Close();
                tcpGo.Close();
            }
        }
        catch (Exception Ex)
        {
            // TODO: Log an exception?
            m_Log.Log(Logging.LOGTYPE.DEBUG, "SendTcpNetworkPacket EXCEPTION: " + Ex.Message);
        }

        // Always just return packet
        return Packet;
    }
    // Actually builds, sends, sets the received bytes and returns the whole packet
    private EDNSPacket SendTcpNetworkPacket(string sDNSIP, string sIPToResolve, int nPort, byte bType, bool bEDNS, byte[] bMachine_ID)
    {
        // Create empty EDNS packet
        EDNSPacket Packet = new EDNSPacket();

        try
        {
            // Send the current machine_id host
            if (bEDNS)
            {
                Packet.CreateEDNSPacketMachineID(sIPToResolve, bType, bMachine_ID);
            }
            else
            {
                Packet.CreateDNSPacket(sIPToResolve, bType);
            }

            if (Packet.GetPacketLen() > 0)
            {
                // Create a tcp client to send the packet
                TcpClient     tcpGo       = new TcpClient(sDNSIP, nPort);
                NetworkStream tcpStream   = tcpGo.GetStream();
                byte[]        packetBytes = Packet.GetPacket();

                // Get length bytes in network byte order
                byte[] lengthBytes = BitConverter.GetBytes((short)packetBytes.Length);
                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(lengthBytes);
                }

                // Prepend the length to the existing data; TCP DNS seems to require this
                byte[] sendBytes = new byte[packetBytes.Length + 2];
                Buffer.BlockCopy(lengthBytes, 0, sendBytes, 0, lengthBytes.Length);
                Buffer.BlockCopy(packetBytes, 0, sendBytes, 2, packetBytes.Length);

                tcpStream.Write(sendBytes, 0, sendBytes.Length);

                // Get the response synchronously (hopefully smaller than 2048)
                byte[] receiveBuffer = new byte[2048];

                int bytesRead = tcpStream.Read(packetBytes, 0, packetBytes.Length);
                if (bytesRead > 0)
                {
                    // Trim off that extra length before returning the packet
                    byte[] buffTrimmed = new byte[bytesRead - 2];
                    Buffer.BlockCopy(receiveBuffer, 2, buffTrimmed, 0, bytesRead - 2);

                    Packet.SetReceivePacket(buffTrimmed);
                }

                tcpStream.Close();
                tcpGo.Close();
            }
        }
        catch (Exception Ex)
        {
            // TODO: Log an exception?
            m_Log.Log(Logging.LOGTYPE.DEBUG, "SendTcpNetworkPacket EXCEPTION: " + Ex.Message);
        }

        // Always just return packet
        return(Packet);
    }
    // Actually builds, sends, sets the received bytes and returns the whole packet
    private EDNSPacket SendUdpNetworkPacket(string sDNSIP, string sIPToResolve, int nPort, byte bType, bool bEDNS, byte[] bMachine_ID)
    {
        // Create empty EDNS packet
        EDNSPacket Packet = new EDNSPacket();

        try
        {
            IPEndPoint Endpoint = new IPEndPoint(IPAddress.Parse(sDNSIP), nPort);

            // Send the current machine_id host
            if (bEDNS)
            {
                Packet.CreateEDNSPacketMachineID(sIPToResolve, bType, bMachine_ID);
            }
            else
            {
                Packet.CreateDNSPacket(sIPToResolve, bType);
            }

            if (Packet.GetPacketLen() > 0)
            {
                // Create a udp client to send the packet
                UdpClient udpGo = new UdpClient();
                udpGo.Client.SendTimeout    = 2000;
                udpGo.Client.ReceiveTimeout = 2000;
                udpGo.Send(Packet.GetPacket(), Packet.GetPacket().Length, Endpoint);

                //IPEndPoint object will allow us to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

                // Launch Asynchronous
                IAsyncResult iarResult = udpGo.BeginReceive(null, null);

                // Wait until complete
                bool     bKill       = false;
                DateTime dtTimeStart = DateTime.Now;
                while (iarResult.IsCompleted == false)
                {
                    // Sleep instead of cycling
                    System.Threading.Thread.Sleep(100);

                    // Watchdog, if doesn't return in 5 seconds get out
                    if (dtTimeStart.AddSeconds(5) < DateTime.Now)
                    {
                        bKill = true;
                        break;
                    }
                }

                // This can hang when not happy about a broken connection
                if (bKill)
                {
                    udpGo.Close();
                }
                else
                {
                    Packet.SetReceivePacket(udpGo.EndReceive(iarResult, ref RemoteIpEndPoint));
                }
            }
        }
        catch (Exception Ex)
        {
            // TODO: Log an exception?
        }

        // Always just return packet
        return(Packet);
    }