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"; } }
/// <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(); } }