public void Creation(string url) { using (var listenSocket = factory.PairOpen().ThenListenAs(out var listener, url).Unwrap()) using (var dialerSocket = factory.PairOpen().ThenDial(GetDialUrl(listener, url)).Unwrap()) { listenSocket.SetOpt(nng.Native.Defines.NNG_OPT_SENDTIMEO, new nng_duration { TimeMs = 50 }); dialerSocket.SetOpt(nng.Native.Defines.NNG_OPT_SENDTIMEO, new nng_duration { TimeMs = 50 }); dialerSocket.SendMsg(factory.CreateMessage()); var msg = listenSocket.RecvMsg().Unwrap(); Assert.True(msg.Pipe.IsValid()); //Assert.True(msg.Pipe.Socket.IsValid()); Assert.False(msg.Pipe.Dialer.IsValid()); Assert.True(msg.Pipe.Listener.IsValid()); listenSocket.SendMsg(factory.CreateMessage()); msg = dialerSocket.RecvMsg().Unwrap(); Assert.True(msg.Pipe.IsValid()); //Assert.True(msg.Pipe.Socket.IsValid()); Assert.True(msg.Pipe.Dialer.IsValid()); Assert.False(msg.Pipe.Listener.IsValid()); } }
public async Task Issue89_FullDuplexPairWithContexts() { const int MAX_CLIENT_COUNT = 4; string url = Util.UrlInproc(); var tasks = new List <Task>(); var cts = new CancellationTokenSource(); int numReceived = 0; using (var socket = factory.PairOpen().ThenListenAs(out var listener, url).Unwrap()) { listener.Start(); foreach (var _ in Enumerable.Range(0, MAX_CLIENT_COUNT)) { var task = Task.Run(async() => { using (var context = socket.CreateAsyncContext(factory).Unwrap()) { context.Aio.SetTimeout(100); while (!cts.IsCancellationRequested) { var _s = await context.Send(factory.CreateMessage()); var _r = (await context.Receive(cts.Token)); } } }); tasks.Add(task); } foreach (var _ in Enumerable.Range(0, MAX_CLIENT_COUNT)) { var task = Task.Run(async() => { using (var socket = factory.PairOpen().ThenDial(url).Unwrap()) using (var context = socket.CreateAsyncContext(factory).Unwrap()) { context.Aio.SetTimeout(100); while (!cts.IsCancellationRequested) { var _s = await context.Send(factory.CreateMessage()); var recv = (await context.Receive(cts.Token)); if (recv.IsOk()) { Interlocked.Increment(ref numReceived); } } } }); tasks.Add(task); } await Util.CancelAfterAssertwait(tasks, cts); } // TODO: better check that all clients/listeners both send and receive messages Assert.True(numReceived > MAX_CLIENT_COUNT * 2); }
/// <summary> /// Create pair socket for pair protocol /// </summary> /// <param name="factory"></param> /// <param name="url"></param> /// <param name="isListener"></param> /// <typeparam name="T"></typeparam> /// <returns></returns> public static NngResult <IPairSocket> PairCreate <T>(this IAPIFactory <T> factory, string url, bool isListener) => factory.DialOrListen(factory.PairOpen(), url, isListener);