/// <summary> /// Stops listening for client connections /// </summary> public void Stop() { _mreIsListening?.Dispose(); _mreIsListening = null; _host?.Stop(); _host = null; }
/// <summary> /// Starts listening for client connections on the specified network interface and port /// </summary> /// <param name="ipAddress">The IP address on which to bind and listen for clients</param> /// <param name="port">The port on which to listen. Must be a positive value.</param> public void Start(IPAddress ipAddress, int port) { if (port <= 0) { throw new ArgumentOutOfRangeException(nameof(port)); } Stop(); _mreIsListening = new ManualResetEventSlim(false); _host = new SecureServer <SecureClient <Message> >(); _host.IsListeningChanged += (isListening) => { IsListeningChanged?.Invoke(isListening); _mreIsListening?.Set(); }; _host.ClientConnected += (client) => { client.Socket.UseCompression = _useCompression; //Log.i("Client Connected: {0}", client.Name); client.Disconnected += (c, remoteEndPoint, exception) => { //var name = (c as GenericClient<Message>)?.Socket.Name ?? "Unknown"; Log.i($"Client Disconnected: {remoteEndPoint.ToString()}"); }; client.MessageReceived += (c, message) => { try { //call the appropriate RPC method OnMessageReceived(ref message); try { //Put this in a task to multi-thread the encryption and compression //Task.Run(() => //{ //send the result back to the client //c.SerializationSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; //c.SerializationSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; //c.Send(message); c.Send(message); //c.As<XClientSecure<Message>>()?.Send(message); //}); } catch (Exception e) { Log.e(e); } } catch (Exception e) { Log.e(e); } }; }; _host.Start(ipAddress, port); }
static void Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource(); var serviceProvider = new ServiceCollection().AddLogging(opt => opt.AddConsole()) .BuildServiceProvider(); ILoggerFactory factory = serviceProvider.GetService <ILoggerFactory>(); Console.WriteLine("1 -> Client"); Console.WriteLine("2 -> Server"); int choice = int.Parse(Console.ReadLine()); switch (choice) { case 1: X509Certificate2Collection clientCollection = new X509Certificate2Collection(); clientCollection.Import("ClientCertificate.pfx", "password", X509KeyStorageFlags.PersistKeySet); client = SimpleNetworking.Builder.Builder.SecureClient .WithLogger(factory) .WithCancellationToken(cts.Token) .Build(ServerCertificateValidationCallback, clientCollection); client.OnPacketReceived += Client_OnPacketReceived; client.OnPeerDeviceDisconnected += Client_OnPeerDeviceDisconnected; client.OnPeerDeviceReconnected += Client_OnPeerDeviceReconnected; string ip = Console.ReadLine(); client.Connect(ip, 9000).Wait(); Console.WriteLine("Connect success"); Task.Run(async() => await SendNumbers()); break; case 2: X509Certificate2Collection serverCollection = new X509Certificate2Collection(); serverCollection.Import("ServerCertificate.pfx", "password", X509KeyStorageFlags.PersistKeySet); SecureServer server = SimpleNetworking.Builder.Builder.SecureServer .WithLogger(factory) .WithCancellationToken(cts.Token) .Build(serverCollection[0], true, ClientCertificateValidationCallback); server.OnClientConnected += Server_OnClientConnected; server.StartListening(IPAddress.Any, 9000); Console.WriteLine("Server started"); break; } Console.ReadKey(); cts.Cancel(); Console.ReadKey(); }
public void Dispose() { SecureServer.Dispose(); UnsecureServer.Dispose(); }