private ISocket WrapSocket(ISocket socket)
        {
            var poolsocket = new PoolSocket(socket, Reclaim);

            _busySockets.Add(socket, new WeakReference(poolsocket));
            return(poolsocket);
        }
        public void Dispose_does_not_dispose_of_encapsulated_socket()
        {
            var     mock      = new MockSocket();
            ISocket reclaimed = null;
            var     socket    = new PoolSocket(mock, (s) => reclaimed = s);

            socket.Dispose();
            Assert.AreEqual(0, mock.DisposeCalled);
        }
        public void Dispose_calls_reclaim_callback_with_encapsulated_socket()
        {
            var     mock      = new MockSocket();
            ISocket reclaimed = null;
            var     socket    = new PoolSocket(mock, (s) => reclaimed = s);

            socket.Dispose();
            Assert.AreSame(mock, reclaimed);
        }
Пример #4
0
        public void Throw_SocketException_when_connection_is_closed() {
            
            // Arrange
            var fakesocket = new FakeSocket { Connected = false, ReceiveCallback = (buffer, offset, length) => { throw new SocketException(); } };
            var callbacks = new PoolSocketCallbacks();
            var poolsocket = new PoolSocket(fakesocket, callbacks.Reclaim);

            // Act
            try {
                poolsocket.Receive(new byte[0], 0, 0);
                Assert.Fail("didn't throw");
            }
            catch (SocketException ex) {

                // Assert
                Assert.AreEqual((int)SocketError.NotConnected, ex.ErrorCode);
            }            
        }
Пример #5
0
        public void On_failure_PoolSocket_and_underlying_socket_are_disposed_and_reclaimed() {

            // Arrange
            var fakesocket = new FakeSocket { ReceiveCallback = (buffer, offset, length) => { throw new SocketException(); } };
            var callbacks = new PoolSocketCallbacks();
            var poolsocket = new PoolSocket(fakesocket, callbacks.Reclaim);

            // Act
            try {
                poolsocket.Receive(new byte[0], 0, 0);
                Assert.Fail("didn't throw");
            } catch(SocketException) { }

            // Assert
            Assert.AreEqual(1, fakesocket.ReceiveCalled, "send called wrong number of times");
            Assert.IsTrue(fakesocket.IsDisposed, "underlying socket wasn't disposed");
            Assert.IsTrue(poolsocket.IsDisposed, "pool socket wasn't disposed");
            Assert.AreEqual(1, callbacks.ReclaimCalled, "reclaim was called wrong number of times");
            Assert.AreSame(fakesocket, callbacks.ReclaimedSocket, "underlying socket wasn't the one reclaimed");
        }
Пример #6
0
 private ISocket WrapSocket(ISocket socket) {
     lock(_syncroot) {
         var poolsocket = new PoolSocket(socket, Reclaim);
         _busySockets.Add(socket, new WeakReference(poolsocket));
         return poolsocket;
     }
 }
Пример #7
0
        private void ReadNetWork(PoolSocket socket)
        {
            var result = socket.Socket.QuietSend(GetGlobalIdDescription, ApiContext.RequestContext.RequestId);

            if (!result.InteractiveSuccess)
            {
                socket.HaseFailed = true;
                //ZeroTrace.WriteError("GetGlobalId", "Send Failed", station, commmand, argument);
                //ApiContext.Current.LastError = ErrorCode.NetworkError;
                State = ZeroOperatorStateType.LocalSendError;
                return;
            }
            if (result.State == ZeroOperatorStateType.Pause)
            {
                socket.HaseFailed = true;
                State             = ZeroOperatorStateType.Pause;
                return;
            }

            result = ReceiveString(socket.Socket);
            if (!result.InteractiveSuccess)
            {
                socket.HaseFailed = true;
                //ZeroTrace.WriteError("GlobalId", "Recv  Failed", station, commmand, argument);
                //ApiContext.Current.LastError = ErrorCode.NetworkError;
                State = ZeroOperatorStateType.LocalRecvError;
                return;
            }

            var old = ApiContext.RequestContext.LocalGlobalId;

            if (result.TryGetValue(ZeroFrameType.GlobalId, out GlobalId))
            {
                ApiContext.RequestContext.LocalGlobalId = GlobalId;
                LogRecorder.MonitorTrace($"GlobalId:{GlobalId}");
            }

            result = socket.Socket.QuietSend(CallDescription,
                                             Commmand,
                                             ApiContext.RequestContext.RequestId,
                                             JsonConvert.SerializeObject(ApiContext.Current),
                                             Argument,
                                             ApiContext.RequestContext.RequestId, //作名称
                                             ApiContext.RequestContext.LocalGlobalId);
            ApiContext.RequestContext.LocalGlobalId = old;
            if (!result.InteractiveSuccess)
            {
                socket.HaseFailed = true;
                //ZeroTrace.WriteError(station, "Send Failed", commmand, argument);
                //ApiContext.Current.LastError = ErrorCode.NetworkError;
                State = ZeroOperatorStateType.LocalSendError;
                return;
            }

            result = ReceiveString(socket.Socket);
            if (!result.InteractiveSuccess)
            {
                socket.HaseFailed = true;
                //ZeroTrace.WriteError("API", "incorrigible", commmand, globalId);
                //ApiContext.Current.LastError = ErrorCode.NetworkError;
                State = ZeroOperatorStateType.LocalRecvError;
                return;
            }

            //if (result.State == ZeroOperatorStateType.NoWorker)
            //{
            //    return;
            //}

            //var lr = socket.Socket.QuietSend(CloseDescription, name, globalId);
            //if (!lr.InteractiveSuccess)
            //{
            //    ZeroTrace.WriteError(station, "Close Failed", commmand, globalId);
            //}
            //lr = ReceiveString(socket.Socket);
            //if (!lr.InteractiveSuccess)
            //{
            //    socket.HaseFailed = true;
            //    ZeroTrace.WriteError(station, "Close Failed", commmand, globalId, lr.ZmqErrorMessage);
            //}
            result.TryGetValue(ZeroFrameType.JsonValue, out _json);
            State = result.State;
        }