static async Task Main(string[] args) { if (args.Length > 0) { var pair = new EnginePair(); pair.Engine1.Main = new CapnpEchoService(); var echoer = (CapabilityReflection.CreateProxy <IEchoer>(pair.Endpoint2.QueryMain()) as IEchoer); await Run(echoer); } else { using var server = new TcpRpcServer(); server.Main = new CapnpEchoService(); server.AddBuffering(); server.StartAccepting(IPAddress.Any, 5002); using var client = new TcpRpcClient(); client.AddBuffering(); client.Connect("localhost", 5002); await client.WhenConnected; using var echoer = client.GetMain <IEchoer>(); await Run(echoer); } }
public void Client() { using (var server = new TcpRpcServer()) using (var client = new TcpRpcClient()) { Assert.IsFalse(client.IsComputing); Assert.IsFalse(client.IsWaitingForData); Assert.AreEqual(0L, client.SendCount); Assert.AreEqual(0L, client.RecvCount); Assert.ThrowsException <InvalidOperationException>(() => client.GetMain <ITestInterface>()); Assert.ThrowsException <ArgumentNullException>(() => client.AttachTracer(null)); Assert.ThrowsException <ArgumentNullException>(() => client.InjectMidlayer(null)); (var addr, int port) = TcpManager.Instance.GetLocalAddressAndPort(); server.StartAccepting(addr, port); client.Connect(addr.ToString(), port); Assert.ThrowsException <InvalidOperationException>(() => client.Connect(addr.ToString(), port)); Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); Assert.ThrowsException <InvalidOperationException>(() => client.AttachTracer(new FrameTracing.RpcFrameTracer(Console.Out, false))); Assert.ThrowsException <InvalidOperationException>(() => client.InjectMidlayer(_ => _)); Assert.AreEqual(port, client.RemotePort); Assert.IsTrue(client.LocalPort != 0); Assert.AreEqual(0L, client.SendCount); Assert.AreEqual(0L, client.RecvCount); Assert.IsTrue(SpinWait.SpinUntil(() => client.IsWaitingForData, MediumNonDbgTimeout)); ((IConnection)client).Close(); Assert.IsTrue(SpinWait.SpinUntil(() => client.State == ConnectionState.Down, MediumNonDbgTimeout)); } }
protected TcpRpcServer SetupServer() { int attempt = 0; while (true) { try { var server = new TcpRpcServer(IPAddress.Any, TcpPort); server.AddBuffering(); return(server); } catch (SocketException) { // If the TCP listening port is occupied by some other process, // retry with a different one if (attempt == 5) { throw; } } IncrementTcpPort(); ++attempt; } }
protected static TcpRpcServer SetupServer(IPAddress addr, int port) { var server = new TcpRpcServer(); server.AddBuffering(); server.StartAccepting(addr, port); return(server); }
/// <summary> /// Somewhat ugly helper method which ensures that both Tcp client and server /// are waiting for data reception from each other. This is a "balanced" state, meaning /// that nothing will ever happen in the RcpEngines without some other thread requesting /// anything. /// </summary> protected void WaitClientServerIdle(TcpRpcServer server, TcpRpcClient client) { var conn = server.Connections[0]; SpinWait.SpinUntil(() => conn.IsWaitingForData && client.IsWaitingForData && conn.RecvCount == client.SendCount && conn.SendCount == client.RecvCount, MediumNonDbgTimeout); }
static void Main(string[] args) { using (var server = new TcpRpcServer()) { server.AddBuffering(); server.Main = new CapnpEchoService(); server.StartAccepting(IPAddress.Any, 5002); Console.WriteLine("Press RETURN to stop listening"); Console.ReadLine(); } }
public void ScatteredTransfer() { using (var server = new TcpRpcServer(IPAddress.Any, TcpPort)) using (var client = new TcpRpcClient()) { server.InjectMidlayer(s => new ScatteringStream(s, 7)); client.InjectMidlayer(s => new ScatteringStream(s, 10)); client.Connect("localhost", TcpPort); client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestInterfaceImpl(counters); using (var main = client.GetMain <ITestInterface>()) { for (int i = 0; i < 100; i++) { var request1 = main.Foo(123, true, default); var request3 = Assert.ThrowsExceptionAsync <RpcException>(() => main.Bar(default));
public void Server3() { using (var server = new TcpRpcServer()) { server.Main = new TestInterfaceImpl2(); var tracer = new FrameTracing.RpcFrameTracer(Console.Out); server.OnConnectionChanged += (s, a) => { a.Connection.Close(); }; (var addr, int port) = TcpManager.Instance.GetLocalAddressAndPort(); server.StartAccepting(addr, port); var client1 = new TcpRpcClient(addr.ToString(), port); Assert.IsTrue(client1.WhenConnected.Wait(MediumNonDbgTimeout)); Assert.IsTrue(SpinWait.SpinUntil(() => client1.State == ConnectionState.Down, MediumNonDbgTimeout)); } }
public void ScatteredTransfer() { (var addr, int port) = TcpManager.Instance.GetLocalAddressAndPort(); using (var server = new TcpRpcServer(addr, port)) using (var client = new TcpRpcClient()) { server.InjectMidlayer(s => new ScatteringStream(s, 7)); client.InjectMidlayer(s => new ScatteringStream(s, 10)); client.Connect(addr.ToString(), port); //client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestInterfaceImpl(counters); using (var main = client.GetMain <ITestInterface>()) { for (int i = 0; i < 100; i++) { var request1 = main.Foo(123, true, default); var request3 = Assert.ThrowsExceptionAsync <RpcException>(() => main.Bar(default));
static async Task Main(string[] args) { using var server = new TcpRpcServer(); server.Main = new CapnpEchoService(); server.AddBuffering(); server.StartAccepting(IPAddress.Any, 5002); using var client = new TcpRpcClient("localhost", 5002); await client.WhenConnected; using var echoer = client.GetMain <IEchoer>(); var payload = new byte[20]; new Random().NextBytes(payload); while (true) { var result = await echoer.Echo(payload); if (result.Count != payload.Length) { throw new InvalidOperationException("Echo server malfunction"); } } }
public void Server1() { var cbb = new BufferBlock <IConnection>(); var server = new TcpRpcServer(); server.Main = new TestInterfaceImpl2(); bool init = true; var tracer = new FrameTracing.RpcFrameTracer(Console.Out); (var addr, int port) = TcpManager.Instance.GetLocalAddressAndPort(); server.OnConnectionChanged += (s, a) => { var c = a.Connection; if (init) { Assert.ThrowsException <ArgumentNullException>(() => c.AttachTracer(null)); c.AttachTracer(tracer); Assert.ThrowsException <ArgumentNullException>(() => c.InjectMidlayer(null)); c.InjectMidlayer(_ => _); Assert.IsFalse(c.IsComputing); Assert.IsFalse(c.IsWaitingForData); Assert.AreEqual(ConnectionState.Initializing, c.State); Assert.IsNotNull(c.RemotePort); Assert.AreEqual(port, c.LocalPort); Assert.AreEqual(0L, c.RecvCount); Assert.AreEqual(0L, c.SendCount); } else { Assert.ThrowsException <InvalidOperationException>(() => c.AttachTracer(tracer)); Assert.ThrowsException <InvalidOperationException>(() => c.InjectMidlayer(_ => _)); Assert.AreEqual(ConnectionState.Down, c.State); } cbb.Post(c); }; Assert.ThrowsException <InvalidOperationException>(() => server.StopListening()); server.StartAccepting(addr, port); Assert.IsTrue(server.IsAlive); Assert.ThrowsException <InvalidOperationException>(() => server.StartAccepting(addr, port)); var server2 = new TcpRpcServer(); Assert.ThrowsException <SocketException>(() => server2.StartAccepting(addr, port)); var client1 = new TcpRpcClient(addr.ToString(), port); var c1 = cbb.Receive(TimeSpan.FromMilliseconds(MediumNonDbgTimeout)); Assert.IsNotNull(c1); Assert.AreEqual(1, server.ConnectionCount); Assert.AreEqual(c1, server.Connections[0]); Assert.AreEqual(ConnectionState.Active, c1.State); var proxy = client1.GetMain <ITestInterface>(); Assert.IsTrue(proxy is IResolvingCapability r && r.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); Assert.IsTrue(c1.RecvCount > 0); Assert.IsTrue(c1.SendCount > 0); var client2 = new TcpRpcClient(addr.ToString(), port); var c2 = cbb.Receive(TimeSpan.FromMilliseconds(MediumNonDbgTimeout)); Assert.IsNotNull(c2); Assert.AreEqual(2, server.ConnectionCount); Assert.AreEqual(c2, server.Connections[1]); init = false; client1.Dispose(); var c1d = cbb.Receive(TimeSpan.FromMilliseconds(MediumNonDbgTimeout)); Assert.IsNotNull(c1d); Assert.AreEqual(1, server.ConnectionCount); Assert.AreEqual(c2, server.Connections[0]); Assert.IsTrue(SpinWait.SpinUntil(() => c1d.State == ConnectionState.Down, MediumNonDbgTimeout)); client2.Dispose(); var c2d = cbb.Receive(TimeSpan.FromMilliseconds(MediumNonDbgTimeout)); Assert.IsNotNull(c2d); Assert.AreEqual(0, server.ConnectionCount); Assert.IsTrue(SpinWait.SpinUntil(() => c2d.State == ConnectionState.Down, MediumNonDbgTimeout)); server.StopListening(); Assert.IsFalse(server.IsAlive); Assert.ThrowsException <InvalidOperationException>(() => server.StopListening()); for (int i = 0; i < 100; i++) { server.StartAccepting(addr, port); Assert.IsTrue(server.IsAlive); server.StopListening(); Assert.IsFalse(server.IsAlive); } server.Dispose(); }