예제 #1
0
        public void AcceptCallback(IAsyncResult ar)
        {
            if (modeNetwork == Mode.indeterminately)
            {
                return;
            }

            TcpListener listener = (TcpListener)ar.AsyncState;

            try
            {
                _node         = new NodeData();
                _node.newNode = listener.EndAcceptTcpClient(ar);
                _node.id      = Global.count;

                NetworkStream ns = _node.newNode.GetStream();
                _node.buffer = new byte[ConstField.LENGTHHEADER];
                ns.BeginRead(_node.buffer, 0, _node.buffer.Length, new AsyncCallback(ReadCallback), _node);

                listener.BeginAcceptTcpClient(AcceptCallback, listener);
                string ip = ((IPEndPoint)_node.newNode.Client.RemoteEndPoint).Address.ToString();
                _node.ipAddress = ip;

                if (modeNetwork == Mode.Host)
                {
                    _node.id = Global.count; // NEW
                    Global.count++;
                    Global.nodes.Add(_node);

                    if (_client != null)
                    {
                        SendData($"Узел подключился {_node.ipAddress}");
                        SendData($"i,{_node.ipAddress},{_node.id}");
                    }
                }

                if (_node.typeNode == NodeData.TypeNode.NODE)
                {
                    Global.nodes.Add(_node);
                }

                if (Accept != null)
                {
                    Accept.BeginInvoke(this, ip.ToString(), null, null);
                }
            }
            catch
            {
                globalState = "Ошибка при соединении. AcceptCallback error";
            }
        }
예제 #2
0
        /// <summary>
        /// Обратный метод завершения принятия клиентов
        /// </summary>
        public void AcceptCallback(IAsyncResult ar)
        {
            if (ModeNetwork == Mode.Indeterminately)
            {
                return;
            }

            var listener = (TcpListener)ar.AsyncState;

            try
            {
                _tcpClient = new TcpClientData {
                    TcpClient = listener.EndAcceptTcpClient(ar)
                };


                // Немедленно запускаем асинхронный метод извлечения сетевых данных
                // для акцептированного TCP клиента
                var ns = _tcpClient.TcpClient.GetStream();
                _tcpClient.Buffer = new byte[Global.Lengthheader];
                ns.BeginRead(_tcpClient.Buffer, 0, _tcpClient.Buffer.Length, ReadCallback, _tcpClient);


                // Продолжаем ждать запросы на подключение
                listener.BeginAcceptTcpClient(AcceptCallback, listener);

                // Активация события успешного подключения клиента
                if (Accept != null)
                {
                    Accept.BeginInvoke(this, null, null);
                }
            }
            catch
            {
                // Обработка исключительных ошибок возникших при акцептирования клиента.
                SoundError();
            }
        }