void Read(IAsyncResult obj)
        {
            ReceiveObj client = (ReceiveObj)obj.AsyncState;
            int        size   = 0;

            try
            {
                //прочитать сообщение
                size = client.socket.EndReceive(obj);
            }
            catch (Exception ex)
            {
                client.message = ex.ToString();
                //текст ошибки передается через тотже тип что и сообщение
                OnError(this, client);
                return;
            }

            client.message = Encoding.UTF8.GetString(client.buffer, 0, size);

            //событие - пием сообщения
            OnReceive(this, client);

            //продолжить прием сообщение с этого сокета
            try
            {
                client.socket.BeginReceive(client.buffer, 0, 1024, SocketFlags.None, Read, client);
            }
            catch (Exception ex)
            {
                client.message = ex.ToString();
                OnError(this, client);
            }
        }
        public Socket ClientStart(string ip, int port)
        {
            Socket soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            soket.Connect(new IPEndPoint(IPAddress.Parse(ip), port));

            ReceiveObj r = new ReceiveObj();

            r.socket = soket;

            //начало приема сообщений
            soket.BeginReceive(r.buffer, 0, 1024, SocketFlags.None, Read, r);

            return(soket);
        }
        private void Accept(IAsyncResult obj)
        {
            //получить прослушивателя
            Socket listener = (Socket)obj.AsyncState;
            //получить сокет нового клиента
            Socket clientSocket = listener.EndAccept(obj);

            //событие
            OnAccept(this, clientSocket);

            //для нового клиента создается экземпляр для передачи всего необходимого
            ReceiveObj r = new ReceiveObj();

            r.socket = clientSocket;

            //начать прием сообщений на новом сокете
            r.socket.BeginReceive(r.buffer, 0, 1024, SocketFlags.None, Read, r);

            //продолжить прием соединений
            listener.BeginAccept(Accept, listener);
        }