SHARE
TWEET

Untitled

a guest Jun 17th, 2019 68 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public class StateObject
  2. {
  3.     // сокет-клиент
  4.     public Socket workSocket = null;
  5.     // размер буфера.  
  6.     public const int BufferSize = 1024;
  7.     // буфер для получателя
  8.     public byte[] buffer = new byte[BufferSize];
  9.     // полученная информация
  10.     public StringBuilder sb = new StringBuilder();
  11. }
  12.  
  13.  
  14. public class SocketAsync
  15. {
  16.     public static ManualResetEvent allDone = new ManualResetEvent(false);
  17.     public SocketAsync() { }
  18.  
  19.     public static void StartListening()
  20.     {
  21.         IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
  22.         IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8005);
  23.  
  24.         // Создаю сокет  
  25.         Socket listener = new Socket(ipAddress.AddressFamily,SocketType.Stream, ProtocolType.Tcp);
  26.  
  27.         // привязываю socket к локальному endpoint и слушаю  
  28.         try
  29.         {
  30.             listener.Bind(localEndPoint);
  31.             listener.Listen(100);
  32.  
  33.             while (true)
  34.             {
  35.                 // Устанавливаю в выключенное состояние
  36.                 allDone.Reset();
  37.  
  38.                 // НАчинаю ассинхронное прослоушивание
  39.                 Console.WriteLine("Waiting for a connection...");
  40.                 listener.BeginAccept(
  41.                     new AsyncCallback(AcceptCallback),
  42.                     listener);
  43.  
  44.                 // ожидаю подключение
  45.                 allDone.WaitOne();
  46.             }
  47.  
  48.         }
  49.         catch (Exception e)
  50.         {
  51.             Console.WriteLine(e.ToString());
  52.         }
  53.  
  54.         Console.WriteLine("nPress ENTER to continue...");
  55.         Console.Read();
  56.  
  57.     }
  58.  
  59.     public static void AcceptCallback(IAsyncResult ar)
  60.     {
  61.         // даю сигнал главному потоку для продолжения работы
  62.         allDone.Set();
  63.  
  64.         // получаю сокет, который обрабатывает запрос клиента
  65.         Socket listener = (Socket)ar.AsyncState;
  66.         Socket handler = listener.EndAccept(ar);
  67.  
  68.         // создаю объект состояния
  69.         StateObject state = new StateObject();
  70.         state.workSocket = handler;
  71.         handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
  72.             new AsyncCallback(ReadCallback), state);
  73.     }
  74.  
  75.     public static void ReadCallback(IAsyncResult ar)
  76.     {
  77.         String content = String.Empty;
  78.  
  79.         //Получаю состояние и сокет-обработчик
  80.         StateObject state = (StateObject)ar.AsyncState;
  81.         Socket handler = state.workSocket;
  82.  
  83.         // Считываю данные из  сокета-клиента
  84.         int bytesRead = handler.EndReceive(ar);
  85.  
  86.         if (bytesRead > 0)
  87.         {
  88.             // сохраняю полученные данные.  
  89.             state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
  90.  
  91.             // проверяю всю ли инфу я считал
  92.             content = state.sb.ToString();
  93.             //if (content.IndexOf("<EOF>") > -1)
  94.             if (content.Length > 0)
  95.             {
  96.                 // записую на сервере
  97.                 Console.WriteLine("Read {0} bytes from socket. n Data : {1}",
  98.                     content.Length, content);
  99.                 // шлю клиенту
  100.                 Send(handler, content);
  101.             }
  102.             else
  103.             {
  104.                 // если считано не все  
  105.                 handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
  106.                 new AsyncCallback(ReadCallback), state);
  107.             }
  108.         }
  109.     }
  110.  
  111.     private static void Send(Socket handler, String data)
  112.     {
  113.         byte[] byteData = Encoding.ASCII.GetBytes(data);
  114.  
  115.         // передаю
  116.         handler.BeginSend(byteData, 0, byteData.Length, 0,
  117.             new AsyncCallback(SendCallback), handler);
  118.     }
  119.  
  120.     private static void SendCallback(IAsyncResult ar)
  121.     {
  122.         try
  123.         {
  124.             // получаю сокет из объекта состояния.  
  125.             Socket handler = (Socket)ar.AsyncState;
  126.  
  127.             // завершаю передачу данных на удаленное устройство
  128.             int bytesSent = handler.EndSend(ar);
  129.             Console.WriteLine("Sent {0} bytes to client.", bytesSent);
  130.  
  131.             //handler.Shutdown(SocketShutdown.Both);
  132.             //handler.Close();
  133.  
  134.         }
  135.         catch (Exception e)
  136.         {
  137.             Console.WriteLine(e.ToString());
  138.         }
  139.     }
  140. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top