示例#1
0
        public void AddListener()
        {
            PipeListener serverPipe = new PipeListener(PipeListener.Name);

            serverPipes.Add(serverPipe);

            serverPipe.DataReceived += (sndr, data) => {
                mDispatcher.BeginInvoke(new Action(() => {
                    Process(serverPipe, data);
                }));
            };

            serverPipe.Connected += (sndr, args) => {
                mDispatcher.BeginInvoke(new Action(() => {
                    // if we used a listener allocate a replacement one
                    AddListener();
                }));
            };

            serverPipe.PipeClosed += (sndr, args) => {
                mDispatcher.BeginInvoke(new Action(() => {
                    serverPipes.Remove(serverPipe);
                }));
            };
        }
 BlockingPipeListener(Loop loop)
     : base(loop)
 {
     PipeListener = new PipeListener(loop);
     Listener     = PipeListener as Listener;
     Handle       = PipeListener;
 }
示例#3
0
		public void NotNullListener()
		{
			var t = new PipeListener();
			Assert.Throws<ArgumentNullException>(() => new PipeListener(null));
			Assert.Throws<ArgumentNullException>(() => t.Bind(null));
			t.Close();
		}
示例#4
0
        public static void Stress(string name)
        {
            for (int j = 0; j < 10; j++)
            {
                int times = 10;

                int close_cb_called   = 0;
                int cl_send_cb_called = 0;
                int cl_recv_cb_called = 0;
                int sv_send_cb_called = 0;
                int sv_recv_cb_called = 0;

                var server = new PipeListener();
                server.Bind(name);
                server.Listen((pipe) => {
                    pipe.Resume();
                    pipe.Read(Encoding.ASCII, (str) => {
                        sv_recv_cb_called++;
                        Assert.AreEqual(Times("PING", times), str);
                        for (int i = 0; i < times; i++)
                        {
                            pipe.Write(Encoding.ASCII, "PONG", (s) => { sv_send_cb_called++; });
                        }
                        pipe.Close(() => { close_cb_called++; });
                        server.Close(() => { close_cb_called++; });
                    });
                });

                Pipe.Connect(name, (_, client) => {
                    client.Resume();
                    for (int i = 0; i < times; i++)
                    {
                        client.Write(Encoding.ASCII, "PING", (s) => { cl_send_cb_called++; });
                    }
                    client.Read(Encoding.ASCII, (str) => {
                        cl_recv_cb_called++;
                        Assert.AreEqual(Times("PONG", times), str);
                        client.Close(() => { close_cb_called++; });
                    });
                });

                Assert.AreEqual(0, close_cb_called);
                Assert.AreEqual(0, cl_send_cb_called);
                Assert.AreEqual(0, cl_recv_cb_called);
                Assert.AreEqual(0, sv_send_cb_called);
                Assert.AreEqual(0, sv_recv_cb_called);

                Loop.Default.Run();

                Assert.AreEqual(3, close_cb_called);
                Assert.AreEqual(times, cl_send_cb_called);
                Assert.AreEqual(1, cl_recv_cb_called);
                Assert.AreEqual(times, sv_send_cb_called);
                Assert.AreEqual(1, sv_recv_cb_called);

#if DEBUG
                Assert.AreEqual(1, UV.PointerCount);
#endif
            }
        }
示例#5
0
 public PipeServer()
 {
     PipeName = string.Format("exTibiaS{0}", GameClient.Process.Id);
     Pipe = new NamedPipeServerStream(PipeName, PipeDirection.InOut, -1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
     OnReceive += new PipeListener(PipeServer_OnReceive);
     Pipe.BeginWaitForConnection(new AsyncCallback(BeginWaitForConnection), null);
 }
示例#6
0
        public void TestEventListener()
        {
            var waitHandle = new ManualResetEvent(false);

            PipeListener.MkStaticInstance();
            PipeListener.staticpipelistener.OnMusicPlay += (songinfo) =>
            {
                Assert.IsNotNull(songinfo.Album);
                Assert.IsNotNull(songinfo.AlbumArtBase64);
                Assert.IsNotNull(songinfo.AlbumArtist);
                Assert.IsNotNull(songinfo.Title);
                Assert.IsNotNull(songinfo.TrackCount);
                Assert.IsNotNull(songinfo.Year);
                Assert.IsNotNull(songinfo.Composer);
                songinfo.GetType().GetProperties().ToList().ForEach(itm =>
                {
                    if (itm.GetValue(songinfo) is string str && itm.Name != "AlbumArtBase64")
                    {
                        Console.WriteLine($"{itm.Name} : {str}");
                    }
                });
                waitHandle.Set();
            };
            waitHandle.WaitOne(Timeout.Infinite);
            PipeListener.staticpipelistener.StopPipeListener();
        }
		BlockingPipeListener(Loop loop)
			: base(loop)
		{
			PipeListener = new PipeListener(loop);
			Listener = PipeListener as Listener;
			Handle = PipeListener;
		}
示例#8
0
        protected override void OnStartup(StartupEventArgs e)
        {
            //Start Pipe Listener
            PipeListener.MkStaticInstance();
            //Load config
            if (Core.ConfigStore.ConfigExists())
            {
                Core.ConfigStore.LoadStaticConfig();
                Core.ConfigStore.StaticConfig.Theme.CurrentTheme.ApplyTheme();
            }
            else
            {
                Core.ConfigStore.StaticConfig.Theme.CurrentTheme.ApplyTheme();
                UI.MainWindow.OpenSingletonWindow();
            }

            //Start Auto Tweet
            AutoTweet.AutoTweetSingleton.InitListner(
                PipeListener.StaticPipeListener ?? throw new InvalidOperationException(), ConfigStore.StaticConfig);
            //Init Notify Icon
            NotifyIconManager.NotifyIconSingleton.InitIcon();
            //Check update
            new UpdateChecker(NotifyIconManager.NotifyIconSingleton).CheckUpdateAsync();
            //Start iTunes Plugin
            Plugin.ITunesPlugin.Start();
        }
示例#9
0
        public void NotNullListener()
        {
            var t = new PipeListener();

            Assert.Throws <ArgumentNullException>(() => new PipeListener(null));
            Assert.Throws <ArgumentNullException>(() => t.Bind(null));
            t.Close();
        }
示例#10
0
        public static void OneSideClose(string name)
        {
            int close_cb_called   = 0;
            int cl_send_cb_called = 0;
            int cl_recv_cb_called = 0;
            int sv_send_cb_called = 0;
            int sv_recv_cb_called = 0;

            var server = new PipeListener();

            server.Bind(name);
            server.IncommingStream += () => {
                var pipe = server.AcceptStream();
                pipe.Resume();
                pipe.Read(Encoding.ASCII, (str) => {
                    sv_recv_cb_called++;
                    Assert.AreEqual("PING", str);
                    pipe.Write(Encoding.ASCII, "PONG", (s) => { sv_send_cb_called++; });
                    pipe.Close(() => { close_cb_called++; });
                    server.Close(() => { close_cb_called++; });
                });
            };
            server.Listen();

            Pipe client = new Pipe();

            client.Connect(name, (_) => {
                client.Read(Encoding.ASCII, (str) => {
                    cl_recv_cb_called++;
                    Assert.AreEqual("PONG", str);
                });

                client.Complete += () => {
                    close_cb_called++;
                };
                client.Resume();
                client.Write(Encoding.ASCII, "PING", (s) => { cl_send_cb_called++; });
            });

            Assert.AreEqual(0, close_cb_called);
            Assert.AreEqual(0, cl_send_cb_called);
            Assert.AreEqual(0, cl_recv_cb_called);
            Assert.AreEqual(0, sv_send_cb_called);
            Assert.AreEqual(0, sv_recv_cb_called);

            Loop.Default.Run();

            Assert.AreEqual(3, close_cb_called);
            Assert.AreEqual(1, cl_send_cb_called);
            Assert.AreEqual(1, cl_recv_cb_called);
            Assert.AreEqual(1, sv_send_cb_called);
            Assert.AreEqual(1, sv_recv_cb_called);

#if DEBUG
            Assert.AreEqual(1, UV.PointerCount);
#endif
        }
示例#11
0
        public void AddListener()
        {
            PipeListener serverPipe = new PipeListener(Name);

            serverPipes.Add(serverPipe);

            serverPipe.DataReceived += (sndr, data) =>
            {
                //mDispatcher.BeginInvoke(new Action(() => {

                EMessageTypes type  = EMessageTypes.eCall;
                int           seqID = 0;
                string        func  = null;
                List <byte[]> args  = PipeListener.ParsePacket(data, ref type, ref seqID, ref func);

                List <byte[]> ret = null;
                if (func == "InitSession")
                {
                    int SessionId = BitConverter.ToInt32(args[0], 0);

                    bool Duplicate = mDispatcher.Invoke(new Func <bool>(() => {
                        return(CountSessions(SessionId) > 0);
                    }));

                    ret = new List <byte[]>();

                    ret.Add(BitConverter.GetBytes(Duplicate));

                    serverPipe.SessionID = SessionId;
                }
                else if (args != null)
                {
                    ret = Process(func, args);
                }

                if (ret != null)
                {
                    serverPipe.SendPacket(type, seqID, func, ret);
                }
                //}));
            };

            serverPipe.Connected += (sndr, args) =>
            {
                mDispatcher.BeginInvoke(new Action(() => {
                    // if we used a listener allocate a replacement one
                    AddListener();
                }));
            };

            serverPipe.PipeClosed += (sndr, args) =>
            {
                mDispatcher.BeginInvoke(new Action(() => {
                    serverPipes.Remove(serverPipe);
                }));
            };
        }
示例#12
0
        protected override void Initialize()
        {
            _pipeListener = new PipeListener(UnsafeLoop, false);
            _pipeListener.Listen(PipeName);

            if (Logger.InfoEnabled)
            {
                Logger.ListeningOnPipe(LoopThreadId, PipeName);
            }
        }
示例#13
0
        protected override void Initialize()
        {
            this.pipeListener = new PipeListener(this.UnsafeLoop, false);
            this.pipeListener.Listen(this.PipeName);

            if (Logger.InfoEnabled)
            {
                Logger.Info("{} ({}) listening on pipe {}.", nameof(DispatcherEventLoop), this.LoopThreadId, this.PipeName);
            }
        }
示例#14
0
        public void OneSideClose(string name)
        {
            int close_cb_called = 0;
            int cl_send_cb_called = 0;
            int cl_recv_cb_called = 0;
            int sv_send_cb_called = 0;
            int sv_recv_cb_called = 0;

            var server = new PipeListener();
            server.Bind(name);
            server.Connection += () => {
                var pipe = server.Accept();
                pipe.Resume();
                pipe.Read(Encoding.ASCII, (str) => {
                    sv_recv_cb_called++;
                    Assert.AreEqual("PING", str);
                    pipe.Write(Encoding.ASCII, "PONG", (s) => { sv_send_cb_called++; });
                    pipe.Close(() => { close_cb_called++; });
                    server.Close(() => { close_cb_called++; });
                });
            };
            server.Listen();

            Pipe client = new Pipe();
            client.Connect(name, (_) => {
                client.Read(Encoding.ASCII, (str) => {
                    cl_recv_cb_called++;
                    Assert.AreEqual("PONG", str);
                });

                client.Complete += () => {
                    close_cb_called++;
                };
                client.Resume();
                client.Write(Encoding.ASCII, "PING", (s) => { cl_send_cb_called++; });
            });

            Assert.AreEqual(0, close_cb_called);
            Assert.AreEqual(0, cl_send_cb_called);
            Assert.AreEqual(0, cl_recv_cb_called);
            Assert.AreEqual(0, sv_send_cb_called);
            Assert.AreEqual(0, sv_recv_cb_called);

            Loop.Default.Run();

            Assert.AreEqual(3, close_cb_called);
            Assert.AreEqual(1, cl_send_cb_called);
            Assert.AreEqual(1, cl_recv_cb_called);
            Assert.AreEqual(1, sv_send_cb_called);
            Assert.AreEqual(1, sv_recv_cb_called);

            #if DEBUG
            Assert.AreEqual(1, UV.PointerCount);
            #endif
        }
示例#15
0
        private void NamedPipesBegin()
        {
            UseThisThreadForEvents();

            PipeSender.begin("FromArduino");
            PipeListener.begin("ToArduino", new NewMessageDelegate(PipesMessageHandler));

            connectionTestTimer = new DispatcherTimer();

            connectionTestTimer.Tick    += ConnectionTestTimer_Tick;
            connectionTestTimer.Interval = new TimeSpan(0, 0, 2);
            connectionTestTimer.Start();
        }
示例#16
0
        public static void Simple(string name)
        {
            int close_cb_called   = 0;
            int cl_send_cb_called = 0;
            int cl_recv_cb_called = 0;
            int sv_send_cb_called = 0;
            int sv_recv_cb_called = 0;

            var server = new PipeListener();

            server.Bind(name);
            server.Listen((pipe) => {
                pipe.Resume();
                pipe.Read(Encoding.ASCII, (str) => {
                    sv_recv_cb_called++;
                    Assert.AreEqual("PING", str);
                    pipe.Write(Encoding.ASCII, "PONG", (s) => { sv_send_cb_called++; });

                    pipe.Close(() => { close_cb_called++; });
                    server.Close(() => { close_cb_called++; });
                });
            });

            Pipe.Connect(name, (_, client) => {
                client.Resume();
                client.Write(Encoding.ASCII, "PING", (s) => { cl_send_cb_called++; });
                client.Read(Encoding.ASCII, (str) => {
                    cl_recv_cb_called++;
                    Assert.AreEqual("PONG", str);
                    client.Close(() => { close_cb_called++; });
                });
            });

            Assert.AreEqual(0, close_cb_called);
            Assert.AreEqual(0, cl_send_cb_called);
            Assert.AreEqual(0, cl_recv_cb_called);
            Assert.AreEqual(0, sv_send_cb_called);
            Assert.AreEqual(0, sv_recv_cb_called);

            Loop.Default.Run();

            Assert.AreEqual(3, close_cb_called);
            Assert.AreEqual(1, cl_send_cb_called);
            Assert.AreEqual(1, cl_recv_cb_called);
            Assert.AreEqual(1, sv_send_cb_called);
            Assert.AreEqual(1, sv_recv_cb_called);

#if DEBUG
            Assert.AreEqual(1, UV.PointerCount);
#endif
        }
示例#17
0
        public void AddListener()
        {
            PipeListener serverPipe = new PipeListener(Name);

            serverPipes.Add(serverPipe);

            serverPipe.DataReceived += (sndr, data) =>
            {
                //mDispatcher.BeginInvoke(new Action(() => {
                RemoteCall call = PipeListener.ByteArrayToObject(data);

                if (call.func == "InitSession")
                {
                    int SessionId = (int)call.args;

                    IPCSession session = new IPCSession();
                    //session.version = App.mVersion;
                    session.duplicate = mDispatcher.Invoke(new Func <bool>(() => {
                        return(CountSessions(SessionId) > 0);
                    }));
                    call.args = session;

                    serverPipe.SessionID = SessionId;
                }
                else
                {
                    call = Process(call);
                }

                serverPipe.Send(PipeListener.ObjectToByteArray(call));
                //}));
            };

            serverPipe.Connected += (sndr, args) =>
            {
                mDispatcher.BeginInvoke(new Action(() => {
                    // if we used a listener allocate a replacement one
                    AddListener();
                }));
            };

            serverPipe.PipeClosed += (sndr, args) =>
            {
                mDispatcher.BeginInvoke(new Action(() => {
                    serverPipes.Remove(serverPipe);
                }));
            };
        }
示例#18
0
        public void SendPushNotification(string func, object args)
        {
            foreach (PipeListener serverPipes in serverPipes)
            {
                if (!serverPipes.IsConnected())
                {
                    continue;
                }

                RemoteCall call = new RemoteCall();
                call.seqID = 0;
                call.type  = "push";
                call.func  = func;
                call.args  = args;

                serverPipes.Send(PipeListener.ObjectToByteArray(call));
            }
        }
        public void TestImageDecoder()
        {
            var waitHandle = new ManualResetEvent(false);

            PipeListener.MkStaticInstance();
            PipeListener.staticpipelistener.OnMusicPlay += (songinfo) =>
            {
                if (songinfo.IsAlbumArtAvaliable())
                {
                    Console.WriteLine($"Image Width : {songinfo.GetAlbumArt().Width}");
                    Console.WriteLine($"Image Height : {songinfo.GetAlbumArt().Height}");
                }
                Assert.IsTrue(songinfo.AlbumArtBase64.Length == 0 || songinfo.IsAlbumArtAvaliable());
                songinfo.GetType().GetProperties().ToList().ForEach(itm => Console.WriteLine($"{itm.Name} : {itm.GetValue(songinfo)}"));
                waitHandle.Set();
            };
            waitHandle.WaitOne(Timeout.Infinite);
            PipeListener.staticpipelistener.StopPipeListener();
        }
示例#20
0
        protected override void Initialize()
        {
            try
            {
                Loop loop = ((ILoopExecutor)this).UnsafeLoop;
                this.pipeListener = new PipeListener(loop, false);
                this.pipeListener.Listen(this.PipeName);

                if (Logger.InfoEnabled)
                {
                    Logger.Info("{} ({}) listening on pipe {}.", nameof(DispatcherEventLoop), this.LoopThreadId, this.PipeName);
                }

                this.pipeStartTaskCompletionSource.TryComplete();
            }
            catch (Exception error)
            {
                this.pipeStartTaskCompletionSource.TrySetException(error);
                throw;
            }
        }
示例#21
0
        protected void Process(PipeListener pipe, byte[] data)
        {
            string t = Thread.CurrentThread.Name;

            RemoteCall call = PipeListener.ByteArrayToObject(data);

            //try
            {
                if (call.func == "GetVersion")
                {
                    call.args = App.mVersion;
                }
                else if (call.func == "GetFilteringMode")
                {
                    call.args = App.engine.GetFilteringMode();
                }
                else if (call.func == "SetFilteringMode")
                {
                    call.args = App.engine.SetFilteringMode((Firewall.FilteringModes)call.args);
                }
                else if (call.func == "GetAuditPol")
                {
                    call.args = App.engine.GetAuditPol();
                }
                else if (call.func == "SetAuditPol")
                {
                    call.args = App.engine.SetAuditPol((Firewall.Auditing)call.args);
                }
                else if (call.func == "GetPrograms")
                {
                    call.args = App.engine.GetPrograms(GetArg <List <Guid> >(call.args, 0));
                }
                else if (call.func == "GetProgram")
                {
                    call.args = App.engine.GetProgram(GetArg <ProgramList.ID>(call.args, 0), GetArg <bool>(call.args, 1));
                }
                else if (call.func == "AddProgram")
                {
                    call.args = App.engine.AddProgram(GetArg <ProgramList.ID> (call.args, 0), GetArg <Guid>(call.args, 1));
                }
                else if (call.func == "UpdateProgram")
                {
                    call.args = App.engine.UpdateProgram(GetArg <Guid>(call.args, 0), GetArg <Program.Config>(call.args, 1));
                }
                else if (call.func == "MergePrograms")
                {
                    call.args = App.engine.MergePrograms(GetArg <Guid>(call.args, 0), GetArg <Guid>(call.args, 1));
                }
                else if (call.func == "SplitPrograms")
                {
                    call.args = App.engine.SplitPrograms(GetArg <Guid>(call.args, 0), GetArg <ProgramList.ID>(call.args, 1));
                }
                else if (call.func == "RemoveProgram")
                {
                    call.args = App.engine.RemoveProgram(GetArg <Guid>(call.args, 0), GetArg <ProgramList.ID>(call.args, 1));
                }
                else if (call.func == "LoadRules")
                {
                    call.args = App.engine.LoadRules();
                }
                else if (call.func == "GetRules")
                {
                    call.args = App.engine.GetRules((List <Guid>)call.args);
                }
                else if (call.func == "UpdateRule")
                {
                    call.args = App.engine.UpdateRule((FirewallRule)call.args);
                }
                else if (call.func == "RemoveRule")
                {
                    call.args = App.engine.RemoveRule((FirewallRule)call.args);
                }
                else if (call.func == "ClearLog")
                {
                    call.args = App.engine.ClearLog((bool)call.args);
                }
                else if (call.func == "CleanUpPrograms")
                {
                    call.args = App.engine.CleanUpPrograms();
                }
                else if (call.func == "GetConnections")
                {
                    call.args = App.engine.GetConnections((List <Guid>)call.args);
                }
                else if (call.func == "GetAllApps")
                {
                    call.args = App.engine.GetAllApps();
                }

                /*else if (call.func == "ApplyTweak")
                 * {
                 *  call.args = App.engine.ApplyTweak((Tweak)call.args);
                 * }
                 * else if (call.func == "TestTweak")
                 * {
                 *  call.args = App.engine.TestTweak((Tweak)call.args);
                 * }
                 * else if (call.func == "UndoTweak")
                 * {
                 *  call.args = App.engine.UndoTweak((Tweak)call.args);
                 * }*/

                else
                {
                    call.args = new Exception("Unknon FunctionCall");
                }
            }

            /*catch (Exception err)
             * {
             *  AppLog.Line("Error in {0}: {1}", MiscFunc.GetCurrentMethod(), err.Message);
             *  call.args = err;
             * }*/
            pipe.Send(PipeListener.ObjectToByteArray(call));
        }
示例#22
0
 private void dispose()
 {
     PipeSender.dispose();
     PipeListener.dispose(new NewMessageDelegate(PipesMessageHandler));
 }
        private void SetupListeners()
        {
            constructionListener = Pipes.RegisterListener<DRTConstructed>(DRTConstructed.PIPE_NAME, new Listener<DRTConstructed>(a => constructionQueue.Enqueue(a)));

            bucketStateListener = Pipes.RegisterListener<BucketState>(BucketState.PIPE_NAME, new Listener<BucketState>(a =>
            {
                Peer p;
                if (peers.TryGetValue(a.LocalId, out p))
                    p.UpdateBucket(a);
            }));

            generalMessageListener = Pipes.RegisterListener<GeneralMessage>(GeneralMessage.PIPE_NAME, new Listener<GeneralMessage>(a => PrintMessage(a.Message)));

            requestListener = Pipes.RegisterListener<IterativeLookupRequest>(IterativeLookupRequest.PIPE_NAME, new Listener<IterativeLookupRequest>(a => lookupStartQueue.Enqueue(a)));
            stepListener = Pipes.RegisterListener<IterativeLookupStep>(IterativeLookupStep.PIPE_NAME, new Listener<IterativeLookupStep>(a => lookupStepQueue.Enqueue(a)));
            requestCompleteListener = Pipes.RegisterListener<IterativeLookupComplete>(IterativeLookupComplete.PIPE_NAME, new Listener<IterativeLookupComplete>(a => lookupEndQueue.Enqueue(a)));
            clearListener = Pipes.RegisterListener<ClearQueries>(ClearQueries.PIPE_NAME, new Listener<ClearQueries>(a =>
                {
                    ClearQuerySet();
                }));
        }
示例#24
0
        public void Stress(string name)
        {
            for (int j = 0; j < 10; j++) {
                int times = 10;

                int close_cb_called = 0;
                int cl_send_cb_called = 0;
                int cl_recv_cb_called = 0;
                int sv_send_cb_called = 0;
                int sv_recv_cb_called = 0;

                var server = new PipeListener();
                server.Bind(name);
                server.Connection += () => {
                    var pipe = server.Accept();
                    pipe.Resume();
                    pipe.Read(Encoding.ASCII, (str) => {
                        sv_recv_cb_called++;
                        Assert.AreEqual(Times("PING", times), str);
                        for (int i = 0; i < times; i++) {
                            pipe.Write(Encoding.ASCII, "PONG", (s) => { sv_send_cb_called++; });
                        }
                        pipe.Close(() => { close_cb_called++; });
                        server.Close(() => { close_cb_called++; });
                    });
                };
                server.Listen();

                Pipe client = new Pipe();
                client.Connect(name, (_) => {
                    client.Resume();
                    for (int i = 0; i < times; i++) {
                        client.Write(Encoding.ASCII, "PING", (s) => { cl_send_cb_called++; });
                    }
                    client.Read(Encoding.ASCII, (str) => {
                        cl_recv_cb_called++;
                        Assert.AreEqual(Times("PONG", times), str);
                        client.Close(() => { close_cb_called++; });
                    });
                });

                Assert.AreEqual(0, close_cb_called);
                Assert.AreEqual(0, cl_send_cb_called);
                Assert.AreEqual(0, cl_recv_cb_called);
                Assert.AreEqual(0, sv_send_cb_called);
                Assert.AreEqual(0, sv_recv_cb_called);

                Loop.Default.Run();

                Assert.AreEqual(3, close_cb_called);
                Assert.AreEqual(times, cl_send_cb_called);
                Assert.AreEqual(1, cl_recv_cb_called);
                Assert.AreEqual(times, sv_send_cb_called);
                Assert.AreEqual(1, sv_recv_cb_called);

            #if DEBUG
                Assert.AreEqual(1, UV.PointerCount);
            #endif
            }
        }