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); }
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); } }
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"); }
private ISocket WrapSocket(ISocket socket) { lock(_syncroot) { var poolsocket = new PoolSocket(socket, Reclaim); _busySockets.Add(socket, new WeakReference(poolsocket)); return poolsocket; } }
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; }