public override bool OnEvent(SocketAsyncEventArgs e) { e.ReturnPool(); if (e.SocketError != SocketError.Success) { return(false); } var protocol = ProtocolFactoryManager.CreateProtocolChain(_protocolChain, _customParameters); if (protocol == null) { Logger.FATAL("Unable to create protocol chain"); _closeSocket = true; return(false); } var tcpCarrier = new TCPCarrier(Socket) { Protocol = protocol.FarEndpoint }; protocol.FarEndpoint.IOHandler = tcpCarrier; tcpCarrier.ReadEnabled = true; if (!SignalProtocolCreated(protocol, _customParameters)) { protocol.Dispose(); _closeSocket = true; return(false); } _success = true; _closeSocket = false; IOHandlerManager.EnqueueForDelete(this); return(true); }
public override bool OnEvent(SocketAsyncEventArgs e) { if (Protocol.IsEnqueueForDelete || Protocol.TimePeriodElapsed()) { return(true); } Logger.FATAL("Unable to handle TimeElapsed event"); IOHandlerManager.EnqueueForDelete(this); return(false); }
public override bool OnEvent(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { switch (e.LastOperation) { case SocketAsyncOperation.ReceiveFrom: if (e.BytesTransferred > 0) { //Debug.WriteLine("receiveFrom:"+e.BytesTransferred); Rx += e.BytesTransferred; } else { Logger.WARN("socket read data error"); return(false); } Protocol.InputBuffer.Published += (uint)e.BytesTransferred; Protocol.SignalInputData(Protocol.InputBuffer, e.RemoteEndPoint as IPEndPoint); if (ReadEnabled) { SetReceiveBuffer(Protocol.InputBuffer, e, 65535); // Protocol.InputBuffer.SetReceiveBuffer(e, 65535); if (!Socket.ReceiveFromAsync(e) && !OnEvent(e)) { IOHandlerManager.EnqueueForDelete(this); } } else { ReadEnabled = false; e.ReturnPool(); } break; case SocketAsyncOperation.Receive: return(false); case SocketAsyncOperation.SendTo: return(false); } return(true); } Logger.WARN(e.SocketError.ToString()); return(false); }
public static bool Connect(EndPoint endpoint, List <ulong> protocolChain, Variant customParameters) { try { var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); var connector = new TCPConnector <T>(socket, protocolChain, customParameters); if (!connector.Connect(endpoint)) { IOHandlerManager.EnqueueForDelete(connector); } } catch (SocketException) { return(SignalProtocolCreated(null, customParameters)); } return(true); }
//public override bool SignalOutputData(MemoryStream ouputStream = null) //{ // while (Protocol.OutputBuffer!=null) // { // var outputBuffer = Protocol.OutputBuffer; // SocketError errorCode; // var sendCount = OutboundFd.Send(outputBuffer.GetBuffer(), // (int)outputBuffer.Consumed, // (int)outputBuffer.Length, SocketFlags.None, out errorCode); // if (errorCode!=SocketError.Success || sendCount <= 0) // { // Logger.FATAL("Unable to send data.{0}:{1}", NearIP, NearPort); // IOHandlerManager.EnqueueForDelete(this); // break; // } // outputBuffer.Ignore((uint)sendCount); // } // //Protocol.OutputBuffer.Recycle(true); // return true; //} public override bool SignalOutputData(EndPoint address, MemoryStream outputStream) { var outputBuffer = new BufferWithOffset(outputStream); while (outputBuffer.Length > 0) { var sendCount = Socket.SendTo(outputBuffer.Buffer, outputBuffer.Offset, outputBuffer.Length, SocketFlags.None, address); if (sendCount < 0) { Logger.FATAL("Unable to send data.{0}:{1}", NearIP, NearPort); IOHandlerManager.EnqueueForDelete(this); break; } outputBuffer.Offset += sendCount; } outputStream.SetLength(0); return(true); }
//void DisableWriteData() //{ // if (!WriteEnabled) return; // _enableWriteDataCalled = false; // Protocol.ReadyForSend(); // WriteEnabled = false; // if (_enableWriteDataCalled) // { // WriteEnabled = true; // } //} public override bool SignalOutputData(MemoryStream s = null) { //if (!WriteEnabled) //{ // WriteEnabled = true; //} WriteEnabled = true; if (s == null) { s = Protocol.OutputBuffer; } var needToSend = s.Length; var buffer = s.GetBuffer(); while (Socket.Connected && needToSend > 0) { try { var sendCount = Socket.Send(buffer, (int)s.Position, (int)needToSend, SocketFlags.None); if (sendCount <= 0) { throw new Exception("sendCount<=0"); } Tx += sendCount; needToSend -= sendCount; s.Position += sendCount; } catch (Exception ex) { Logger.FATAL("Unable to send data.{0}:{1} -> {2}:{3}", FarIP, FarPort, NearIP, NearPort); IOHandlerManager.EnqueueForDelete(this); return(false); } } s.SetLength(0); WriteEnabled = false; return(true); }
public override bool OnEvent(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { switch (e.LastOperation) { case SocketAsyncOperation.Receive: if (e.BytesTransferred > 0) { Rx += e.BytesTransferred; } else { Logger.WARN("socket read data error"); return(false); } //Logger.INFO("rec:{0}",Rx); Protocol.InputBuffer.Published += (uint)e.BytesTransferred; Protocol.SignalInputData(e.BytesTransferred); if (ReadEnabled) { SetReceiveBuffer(Protocol.InputBuffer, e); if (!Socket.ReceiveAsync(e) && !OnEvent(e)) { IOHandlerManager.EnqueueForDelete(this); } } else { //ReadEnabled = false; e.ReturnPool(); } break; //case SocketAsyncOperation.Send: // if (Protocol.OutputBuffer == null) // { // DisableWriteData(); // } // else // { // if (e.BytesTransferred < 0) // { // Logger.FATAL("Unable to send data.{0}:{1} -> {2}:{3}", FarIP, FarPort, NearIP, NearPort); // IOHandlerManager.EnqueueForDelete(this); // return false; // } // Protocol.OutputBuffer.Ignore((uint)e.BytesTransferred); // // if(e.BytesTransferred==4096)Logger.Debug("{0}", e.BytesTransferred); // Tx += e.BytesTransferred; // if (Protocol.OutputBuffer != null && WriteEnabled) // { // SetSendBuffer( Protocol.OutputBuffer,e); // if (!OutboundFd.SendAsync(e) && !OnEvent(e)) IOHandlerManager.EnqueueForDelete(this); // } // else // { // DisableWriteData(); // e.ReturnPool(); // } // } // break; } return(true); } Logger.WARN("{1}({0}):" + e.SocketError, Id, GetType().Name); return(false); }