Facebook
From Small Crow, 1 Year ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 180
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Collections;
  6. using System.Threading;
  7. using System.Linq;
  8.  
  9. public class UdpSrvrSample
  10. {
  11.     private static int game_state = 0;//0-gra czeka na rozpoczecie 1- gra skonczona;
  12.     private static int connected_hosts = 0;//licznik hostow
  13.     private static int times_up = 0;//0-nie minelo jeszcze 10s
  14.     private static Random random = new Random();
  15.     public static int sekretna = random.Next(0, 15);
  16.     public static int time2;
  17.  
  18.     public static void Timer(string h2,string h1)
  19.     {
  20.         int id1 = Convert.ToInt32(h1, 2);
  21.         int id2 = Convert.ToInt32(h2, 2);
  22.         time2 = (((id1 + id2) * 99) % 100) + 30;
  23.        
  24.         while(time2!=0)
  25.         {
  26.             if (time2 >= 10)
  27.             {
  28.             Thread.Sleep(10000);
  29.             time2 = time2 - 10;
  30.             }    
  31.             else
  32.             {
  33.                 Thread.Sleep(time2 * 1000);
  34.                 time2 = 0;
  35.                 game_state++;//timeout
  36.             }
  37.            
  38.             times_up++;
  39.         }
  40.        
  41.     }
  42.     static byte [] ProtocolBuilder(string operation,string response,string idref,string dop="none")//buduje pakiet
  43.    {
  44.         int pom1 = 0, pom2 = 0, pom3 = 0, pom4 = 0;
  45.        BitArray c = new BitArray(24);
  46.         BitArray g = new BitArray(24);
  47.         byte[] data = new byte[3];
  48.         for (int i=0;i<c.Length;i++)
  49.         {
  50.             if(i<=5)
  51.             {
  52.                 if (operation[pom1] == '0')
  53.                     c[i] = false;
  54.                 else
  55.                     c[i] = true;
  56.                 pom1++;
  57.             }  
  58.             if(i>5 && i<=9)
  59.             {
  60.                 if (response[pom2] == '0')
  61.                     c[i] = false;
  62.                 else
  63.                     c[i] = true;
  64.                 pom2++;
  65.             }
  66.             if(i>9 && i<=17)
  67.             {
  68.                 if (idref[pom3] == '0')
  69.                     c[i] = false;
  70.                 else
  71.                     c[i] = true;
  72.                 pom3++;
  73.             }
  74.             if (i > 17)
  75.             {
  76.                     if(dop=="none")
  77.                     c[i] = false;
  78.                     else
  79.                     {
  80.                     if (dop[pom4] == '0')
  81.                         c[i] = false;
  82.                     else
  83.                         c[i] = true;
  84.                     pom4++;
  85.                     }
  86.                    
  87.             }
  88.                
  89.         }
  90.         for (int i = 0; i < c.Length; i++)
  91.         {
  92.             g[g.Length - i-1] = c[i];
  93.         }
  94.         g.CopyTo(data, 0);
  95.         Array.Reverse(data, 0, data.Length);
  96.         return data;
  97.    }
  98.  
  99.    
  100.     public static string ToBin(int value, int len)//int do binarki
  101.     {
  102.         return (len > 1 ? ToBin(value >> 1, len - 1) : null) + "01"[value & 1];
  103.     }
  104.     public static string[] DecodePacket(byte[] c)//funkcja odbiera pobrane inty i zamienia je na kod binarny
  105.     {
  106.         string h = "";
  107.         string [] a=new string[3];
  108.         for (int i = 0; i < c.Length;i++)
  109.         {
  110.             h=h+ ToBin(c[i], 8);//dopelnia do 8 bitow
  111.  
  112.         }
  113.         for(int i=0;i<h.Length;i++)// podzial pakietu na pole operacyjne, pole odpowiedzi i identyfikator
  114.         {//dopelnienie jest nieistotne wiec jest ignorowane
  115.             if (i <= 5)
  116.                 a[0] =a[0]+ h[i];
  117.             if (i > 5 && i <= 9)
  118.                 a[1] = a[1] + h[i];
  119.             if (i > 9 && i <= 17)
  120.                 a[2] = a[2] + h[i];
  121.         }
  122.         return a;
  123.     }
  124.    
  125.     public static string RandomString(int length)// funckja losujaca id sesji
  126.     {
  127.         string liczba;
  128.         if(connected_hosts==1)
  129.         {
  130.             int h = random.Next(0, 121);
  131.             liczba = ToBin(h,8);
  132.         }
  133.         else
  134.         {
  135.             int h = random.Next(122, 254);
  136.             liczba = ToBin(h, 8);
  137.         }
  138.         return liczba;
  139.     }
  140.     static byte [] TellAction(byte[] c,ref string h)//ustalanie akcji na podstawie pola operacji
  141.     {
  142.        
  143.         byte[] bytes = new byte[3];
  144.         string[] packet = new string[3];
  145.         packet = DecodePacket(c);
  146.         switch (packet[0])
  147.         {
  148.             case "000000":
  149.                 {
  150.                     h = RandomString(8);
  151.                     bytes = ProtocolBuilder("100000", "0000", h);
  152.                     break;
  153.                 }
  154.             case "010000":
  155.                 {
  156.                     string l = ToBin(sekretna, 4);
  157.                     if (l == packet[1])
  158.                     {
  159.                         bytes = ProtocolBuilder("110000", "0000", h);
  160.                         game_state = 1;
  161.                     }
  162.  
  163.                     else
  164.                         bytes = ProtocolBuilder("001000", "0000", h);
  165.                     break;
  166.                 }
  167.             case "110100":
  168.                 {
  169.                     //connected_hosts--;
  170.                     //game_state = 1;
  171.                     break;
  172.                 }
  173.         }
  174.         return bytes;
  175.     }
  176.     public static void SecondChannel(int port,  string h)//kanal w ktorym do serwer inicjuje komunikacje
  177.     {
  178.         IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port+10);
  179.         UdpClient newsock = new UdpClient(ipep);
  180.         IPEndPoint sender = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 0);
  181.         ReceivePacket(ref newsock, ref sender, ref h);
  182.         while (true)
  183.         {
  184.             if(game_state == 1)// wysylanie pakietu informujacego o koncu gry
  185.             {
  186.                 byte[] newArray = new byte[3];
  187.                 if(time2==0)
  188.                 {
  189.                 newArray = ProtocolBuilder("111000", "0000", h);//timeout
  190.                 }
  191.                 else
  192.                 {
  193.                    newArray = ProtocolBuilder("111000", "1111", h);//liczba zostala zgadnieta
  194.                 }          
  195.                 SendPacket(newsock, newArray, sender);
  196.             }
  197.             if(times_up==1 && game_state==0)
  198.             {
  199.                 byte[] newArray = new byte[3];
  200.                 string czas = ToBin(time2,10);
  201.                 string part1 = "", part2 = "";
  202.                 for (int i = 0; i <= 3; i++)
  203.                     part1 = part1+czas[i];
  204.                 for (int i = 4; i <10; i++)
  205.                     part2 = part2 + czas[i];
  206.                
  207.  
  208.                 newArray = ProtocolBuilder("101000", part1, h, part2);    
  209.                 SendPacket(newsock, newArray, sender);
  210.                 Console.WriteLine("Wysylam pakiet czasu");
  211.                 times_up = 0;
  212.             }
  213.         }
  214.  
  215.     }
  216.     public static void CallToChildThread(int port,ref string h)
  217.     {
  218.         int g=0;
  219.         byte[] data = new byte[3];
  220.         string c = h;
  221.         Thread thread3 = new Thread(() => SecondChannel(port, c));
  222.         IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
  223.         UdpClient newsock = new UdpClient(ipep);
  224.         IPEndPoint sender = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 0);
  225.         byte[] bytes = new byte[3];  
  226.         data = ReceivePacket(ref newsock, ref sender, ref h);
  227.        
  228.  
  229.         bytes=TellAction(data, ref h);
  230.         SendPacket(newsock, bytes, sender);
  231.         connected_hosts++;
  232.         thread3.Start();
  233.         while (true)
  234.         {
  235.             if(g==0 && connected_hosts==2)//czeka na polaczenie obu hostow po czym wysyla informacje o rozpoczeciu rozgrywki
  236.             {    
  237.                 g = 1;
  238.                 byte[] newArray = new byte[3];
  239.                 newArray = ProtocolBuilder("100100", "0000", h);            
  240.                 SendPacket(newsock, newArray, sender);
  241.             }
  242.             if (g == 1 && connected_hosts == 2)//pobiera liczbe wyslana przez klienta i odsyla prawda/falsz
  243.             {
  244.                 data = ReceivePacket(ref newsock, ref sender, ref h);
  245.                 bytes = TellAction(data, ref h);
  246.                 SendPacket(newsock, bytes, sender);
  247.             }
  248.            
  249.         }
  250.  
  251.        
  252.     }
  253.     static void SendPacket(UdpClient klient,byte [] bytes,IPEndPoint sender)//wysyla dane po czym czeka na potwierdzenie
  254.     {
  255.         klient.Send(bytes, bytes.Length, sender);
  256.         klient.Receive(ref sender);
  257.  
  258.     }
  259.     static byte[] ReceivePacket(ref UdpClient klient,ref IPEndPoint sender,ref string h )//zapisuje wyslane dane i potwierdza ich odebranie
  260.     {
  261.         byte[] ACK = new byte[3];
  262.         byte[] data = new byte[3];
  263.         data = klient.Receive(ref sender);
  264.         ACK= ProtocolBuilder("111111", "0000", h);
  265.        
  266.         klient.Send(ACK, ACK.Length, sender);
  267.         return data;
  268.     }
  269.     public static void Main()
  270.     {
  271.         byte[] data = new byte[3];
  272.  
  273.         string h1 = "00000000";
  274.         string h2 = "00000000";
  275.         Console.Write("Losowa liczba to: ");
  276.         Console.Write(sekretna);
  277.  
  278.         Thread thread2 = new Thread(() => CallToChildThread(9050,ref h1));//po jednym watku dla kazdego klienta
  279.         Thread thread3 = new Thread(() => CallToChildThread(9051,ref h2));
  280.         thread2.Start();
  281.         thread3.Start();
  282.         while(true)//zatrzymuje watek do momentu polaczenia dwoch klientow, niesamowicie oszczedne rozwiazanie
  283.         {
  284.             if (connected_hosts == 2)
  285.                 break;
  286.         }
  287.  
  288.         Thread timer = new Thread(() => Timer( h1, h2));
  289.         timer.Start();
  290.  
  291.        
  292.         int a = Console.Read();
  293.            
  294.        
  295.  
  296.     }
  297. }