Difference between revisions of "Programmering III Experthold"

From Teknologisk videncenter
Jump to: navigation, search
(XML:)
Line 359: Line 359:
 
     }
 
     }
 
</source>
 
</source>
 +
 +
===Opgave:===
 +
Konverter en klasse til XML og send den igennem en netværksforbindelse. Konverter da XML tilbage til en klasse på en anden computer.

Revision as of 12:13, 11 December 2017

Generelt:

Mail: makn@mercantec.dk

Torsdag

Sådan importeres en .exe fil ind i et application domain:

        static void Main(string[] args)
        {
            AppDomain appDomain = AppDomain.CreateDomain("New Domain");
            appDomain.ExecuteAssembly("HelloWorld.exe");

        }


Hent denne fil, og lav et program der bruteforcer kodeordet. kodeordetindeholder kun lowerCase bogstaver, som ikke indeholder æ, ø eller å (hint: kodeordet er "hot"):

Efter at du har hentet filen, højreklik da på den og vælg egnskaber/properties. Nederst i venstre hjørne er der et flueben som skal fjernes i "fjern blokering".

MadsFjernBlokering.jpg


https://drive.google.com/file/d/1KuRDP74fuzuChf4RfFNq2E5pRw6MH2Wp/view?usp=sharing

Eksempel på kode:

        static void Main(string[] args)
        {
            AppDomain encryptedFile = AppDomain.CreateDomain("New Appdomain");
            string[] key = {"aaa"};

            int success = encryptedFile.ExecuteAssembly("EncryptedFile.exe ", key);

            if(sucess == 1)
            {
                 Console.Writeline("Koden var korrekt");
            }
            else
            {
                 Console.WriteLine("Koden var forkert");
            }


            Console.ReadKey();
        }


Hjælpekode:

        static void Main(string[] args)
        {
            char[] letters = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

            int numberOfLetters = letters.Length; //26 LETTERS
            Console.WriteLine("Number of letters: {0}", numberOfLetters);

            for (int i = 0; i < numberOfLetters; i++)
            {
                Console.WriteLine(letters[i]);
            }
            Console.ReadKey();
        }


Udvid din bruteforce algoritme så den kan distribueres på flere PC'er, så de hver kan tage et segment af kode, Prøv at knække koden på følgende fil: https://drive.google.com/file/d/1Fu9I-6HCKhU71gE1rMxpk-UZ2XrwVjeY/view?usp=sharing Husk at fjerne blokaden lige som ved den sidste fil

Koden indeholder 6 ialt bogstaver (stadig kun lowercase bogstaver). Benyt hinandens computere til at finde koden.


Fredag:

Godmorgen. I dag vil jeg gerne have at i gennemgår følgende emner: UDP netværks-protokollen og tråde.


For at kunne sene data fra én PC til en anden igennem et netværk skal man benytte en netværks-protokol. Der findes mange protokoller som kan benyttes, men i skal i dag arbejde med UDP protokollen.

UDP er en simpel protokol som kan sende en datapakke afsted imod en IP adresse, men om pakken når frem eller ej, finder vi aldrig ud af. Der er altså i visse tilfælde 50% chance for at pakken når frem til modtageren, hvis vi er på et dårligt netværk.

For at se UDP i aktion, skal vi benytte en Listener og en Sender.

Prøv at indsætte følgende kode i 2 forskellige C# konsol programmer, og start Listeneren først, derefter start Senderen.

Listener:

static void Main(string[] args)
        {
            UdpClient client = new UdpClient(11001);
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 11001);

            byte[] recievedBytes = client.Receive(ref endpoint);
            string recievedMessage = Encoding.ASCII.GetString(recievedBytes);
            Console.WriteLine("Beskeden var: " + recievedMessage);
            Console.ReadKey();
        }


Sender:

        static void Main(string[] args)
        {
            Console.WriteLine("Type an IP address:");
            string ip = Console.ReadLine();

            UdpClient client = new UdpClient();
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), 11001);

            string message = "Hej!";

            byte[] bytesToSend = Encoding.ASCII.GetBytes(message);
            client.Send(bytesToSend, bytesToSend.Length, endpoint);
            Console.WriteLine("Message sendt!");
            Console.ReadKey();
        }

For at et program både kan sende OG modtage datapakker igennem UDP, skal vi benytte en tråd. En tråd er en måde hvor vi kan få vores applikation til at udføre 2 forskellige jobs på samme tid.

I C# er det heldigvis nemt at oprette en tråd.

Eksempel på en tråd:

static void Main(string[] args)
        {
            Console.WriteLine("Start");
 
            Thread thread = new Thread(myThread);
            thread.Start();
 
            string input = Console.ReadLine();
            Console.WriteLine(input);
            Console.ReadKey();
        }
 
        static void myThread()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }



Opgave: Lav et program, som både kan sende og modtage data til og fra hinanden.


Se hvor langt du kan nå. Vi gennemgår løsningen på mandag.


TCP:

TCP sender:

static TcpClient tcpClient;
        static NetworkStream ns;
        static IPEndPoint endPoint;

        static void Main(string[] args)
        {
            tcpClient = new TcpClient("172.16.237.161", 11000);
            ns = tcpClient.GetStream();

            for (int i = 1; i <= 100; i++)
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes(i.ToString() + "\n");
                ns.Write(bytesToSend, 0, bytesToSend.Length);
            }
            Console.ReadKey();
        }


TCP listener:

static TcpListener tcpListener;
        static TcpClient tcpClient;
        static IPEndPoint endPoint;
        static NetworkStream ns;
        static Stopwatch sw;
        static long milliseconds;
        static int index = 0;
        static bool run = true;

        static Thread t;

        //Listens for TCP data
        static void Main(string[] args)
        {
            t = new Thread(ListenerThread);
            sw = new Stopwatch();

            IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, 11000);

            tcpListener = new TcpListener(ipEndPoint_any);
            tcpClient = new TcpClient();
            tcpListener.Start();

            tcpClient = tcpListener.AcceptTcpClient();
            endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
            ns = tcpClient.GetStream();
            t.Start();

            Console.ReadKey();
            Console.WriteLine("I recived " + index + " number of packages out of 100.");
            Console.WriteLine("It took " + milliseconds + " milliseconds in total");
            run = false;
            t.Abort();
            Console.ReadKey();
        }

        static void ListenerThread()
        {
            while (run)
            {
                if (ns.DataAvailable)
                {
                    if (!sw.IsRunning)
                    {
                        sw.Start();
                    }
                    byte[] recivedBytes = new byte[512];
                    byte[] trimmedBytes;
                    int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length);
                    trimmedBytes = new byte[bytesRead];
                    Array.Copy(recivedBytes, trimmedBytes, bytesRead);
                    string result = Encoding.ASCII.GetString(trimmedBytes);
                    Console.Write(result);
                    milliseconds = sw.ElapsedMilliseconds;
                    index++;
                }
            }
        }

Opgave:

Lav et simpelt chatprogram der benytter TCP, hvor man både kan sende og modtage beskeder.


TCP Listener v2.0

class Listener
    {
        TcpListener tcpListener;
        TcpClient tcpClient;
        IPEndPoint endPoint;
        bool run = true;
        List<Thread> threadList = new List<Thread>();
        int port = 11000;

        public Listener()
        {
            IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, port);

            tcpListener = new TcpListener(ipEndPoint_any);
            tcpClient = new TcpClient();
            tcpListener.Start();

            while (true)
            {
                if(tcpListener.Pending())
                {
                    Thread.Sleep(100);
                    Thread t = new Thread(ListenerThread);
                    t.Start();
                    t.IsBackground = true;
                    threadList.Add(t);
                }
            }
        }

        void ListenerThread()
        {
            port++;
            tcpClient = tcpListener.AcceptTcpClient();
            endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
            NetworkStream ns = tcpClient.GetStream();
            Console.WriteLine("TCP connection acceptet by thread.");
            while (run)
            {
                if (ns.DataAvailable)
                {
                    byte[] recivedBytes = new byte[512];
                    byte[] trimmedBytes;
                    int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length);
                    trimmedBytes = new byte[bytesRead];
                    Array.Copy(recivedBytes, trimmedBytes, bytesRead);
                    string result = Encoding.ASCII.GetString(trimmedBytes);
                    Console.Write(result);
                }
            }
        }

XML:

Konverter en klasse til XML:

 static void Main(string[] args)
        {
            Henry h = new Henry();

            Console.WriteLine("Money :" + h.money);
            Console.WriteLine("Idears: " + h.idears);
            Console.ReadKey();
            
            //XML 
            XmlSerializer serializer = new XmlSerializer(typeof(Henry));
            StringWriter sWriter = new StringWriter();
            serializer.Serialize(sWriter, h);

            string myXML = sWriter.ToString();

            Console.WriteLine(myXML);
            Console.ReadKey();

            //Konverter XML tilbage til en klasse:
            Henry h2 = new Henry();
            StringReader sReader = new StringReader(myXML);
            h2 = (Henry)serializer.Deserialize(sReader);

            Console.WriteLine("Henry 2 money: " + h2.money);
            Console.WriteLine("Henry 2 idears: " + h2.idears);
            Console.ReadKey();
        }

Henry klassen:

    public class Henry
    {
        public float money = 1000;
        public int idears = 0;
    }

Opgave:

Konverter en klasse til XML og send den igennem en netværksforbindelse. Konverter da XML tilbage til en klasse på en anden computer.