public void OneConnection_PendingBeforeSyncAccept() { TestWcLsnrBluetoothFactory f = new TestWcLsnrBluetoothFactory(); TestLsnrRfCommIf commIf = new TestLsnrRfCommIf(); f.queueIRfCommIf.Enqueue(commIf); TestLsnrRfcommPort port0 = new TestLsnrRfcommPort(); f.queueIRfCommPort.Enqueue(port0); BluetoothFactory.SetFactory(f); // port0.SetOpenServerResult(PORT_RETURN_CODE.SUCCESS); BluetoothListener lsnr = new BluetoothListener(BluetoothService.VideoSource); try { Assert.IsFalse(lsnr.Pending(), "!Pending before Start"); lsnr.Start(); port0.AssertOpenServerCalledAndClear(29); //adter Start? TestLsnrRfcommPort port1 = new TestLsnrRfcommPort(); port1.SetOpenServerResult(PORT_RETURN_CODE.SUCCESS); // now begun immediately f.queueIRfCommPort.Enqueue(port1); Assert.IsFalse(lsnr.Pending(), "!Pending before"); port0.NewEvent(PORT_EV.CONNECTED); Thread.Sleep(100); Assert.IsTrue(lsnr.Pending(), "Pending"); BluetoothClient cli = lsnr.AcceptBluetoothClient(); TestSdpService2 sdpSvc = f.GetTestSdpService(); Assert.AreEqual(0, sdpSvc.NumDisposeCalls, "NumDisposeCalls"); lsnr.Stop(); Assert.AreEqual(1, sdpSvc.NumDisposeCalls, "NumDisposeCalls"); // Assert.IsTrue(cli.Connected, "cli.Connected"); //TODOAssert.AreEqual(0, f.queueIRfCommPort.Count, "Used both ports"); //TODO port1.AssertCloseCalledOnce("second acceptor closed"); cli.Close(); port0.AssertCloseCalledOnce("first accepted connection now closed"); // BluetoothEndPoint lep = lsnr.LocalEndPoint; sdpSvc.AssertCalls( "AddServiceClassIdList: 00001303-0000-1000-8000-00805f9b34fb" + NewLine + "AddRFCommProtocolDescriptor: " + lep.Port + NewLine ); // // } finally { lsnr.Stop(); // See errors that might otherwise occur on the Finalizer. } }
private void ListenerLoop() { if (_stringBuilder == null) { return; } BluetoothListener listener = new BluetoothListener(new Guid(c_socket_Guid)) { Authenticate = false , ServiceClass = ServiceClass.Network | ServiceClass.Information }; try { listener.Start(); while (!_needCancel) { if (listener.Pending()) { _clientSocket = listener.AcceptSocket(); if (_clientSocket == null) { throw new ArgumentNullException(nameof(_clientSocket)); } UpdateMessages($"Получено клиентское соединение для {_clientSocket.RemoteEndPoint}"); byte[] buffer = new byte[4096]; while (_clientSocket.Connected) { try { int bytes = _clientSocket.Receive(buffer); if (bytes == 0) { continue; } string message = Encoding.UTF8.GetString(buffer, 0, bytes); _stringBuilder.Append(message); string fullMessage = _stringBuilder.ToString(); int endIndex = fullMessage.IndexOf("\r\n", StringComparison.Ordinal); if (endIndex < 0) { continue; } _stringBuilder.Clear(); UpdateMessages(@"Принята команда: " + fullMessage); dxCommand command = dxCommand.Deserialize(fullMessage); if (command == null) { continue; } // ReSharper disable once SwitchStatementMissingSomeCases switch (command.Name) { case CommandNames.Get_Attributes: { dxCommand result = new dxCommand(_mainForm.Data.Attributes) { Name = CommandNames.Get_Attributes }; string reply = result.Serialize() + "\r\n"; byte[] toSend = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(reply)); _clientSocket.Send(toSend, toSend.Length, SocketFlags.None); UpdateMessages("Отправлен ответ: " + reply); break; } case CommandNames.Get_Parameters: { dxCommand result = new dxCommand(_mainForm.Data.Parameters) { Name = CommandNames.Get_Parameters }; string reply = result.Serialize() + "\r\n"; byte[] toSend = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(reply)); _clientSocket.Send(toSend, toSend.Length, SocketFlags.None); UpdateMessages("Отправлен ответ: " + reply); break; } case CommandNames.Set_Parameters: { foreach (dxParameter parameter in command.Parameters.ParameterItem) { foreach (dxParameter deviceParameter in _mainForm.Data.Parameters.ParameterItem.Where(deviceParameter => deviceParameter.Id.Equals(parameter.Id))) { switch (deviceParameter.Type) { case ParameterType.Bool: { deviceParameter.BoolValue = parameter.BoolValue; break; } case ParameterType.Int: { deviceParameter.IntValue = parameter.IntValue; break; } default: { continue; } } UpdateParameterValue(_mainForm.Data.Parameters.ParameterItem.IndexOf(deviceParameter), deviceParameter); UpdateMessages(@"Установить значение параметра " + deviceParameter.Name); } } break; } } } catch (IOException ex) { UpdateMessages(@"Соединение разорвано: " + ex); break; } } } else { Thread.Sleep(500); } } } catch (Exception ex) { UpdateMessages(ex.ToString()); } finally { CloseCommunication(); listener.Stop(); } }