internal void EndReceive(IAsyncResult res) { try { var state = res.AsyncState as SocketReceiveBundle; var count = state.TcpClient.Client.EndReceive(res); if (count <= 0) { this.Disconnect(); return; } this.MessageProcessor.AddData(state.Buffer.Take(count).ToArray()); while (true) { var buff = this.MessageProcessor.PopMessage(); if (buff == null) break; this.CallOnDataReceived(buff); } var bundle = new SocketReceiveBundle(this.Client); this.Client.Client.BeginReceive( bundle.Buffer, 0, SocketReceiveBundle.BufferSize, SocketFlags.None, this.EndReceive, bundle); } catch (SocketException e) { Log.Warn("EndReceive", e); this.Disconnect(); } catch (ObjectDisposedException e) { Log.Warn("EndReceive", e); this.Disconnect(); } catch (Exception e) { Log.Warn("EndReceive", e); } }
public void Connect() { lock (this) { if (this.EndPoint == null) throw new InvalidOperationException("EndPoint must be set."); if (this.Status != SocketStatus.Disconnected) throw new InvalidOperationException("You can't connect if the socket isn't disconnected"); Log.Debug("Connect"); if (this.Client.IsDisposed()) { this.Client = new TcpClient(); } this.Client.Connect(this.EndPoint); this.Status = SocketStatus.Connected; } this.CallOnConnectionEvent(this.FirstConnection ? SocketConnectionEvent.Connected : SocketConnectionEvent.Reconnected); this.FirstConnection = false; var bundle = new SocketReceiveBundle(this.Client); this.Client.Client.BeginReceive( bundle.Buffer, 0, SocketReceiveBundle.BufferSize, SocketFlags.None, this.EndReceive, bundle); }
public void Setup(TcpClient client, ISocketMessageProcessor processor) { lock (this) { if(client == null)throw new ArgumentNullException("client"); if (processor == null) throw new ArgumentNullException("processor"); if (this.Status != SocketStatus.Disconnected) throw new InvalidOperationException("You can't setup a socket if it isn't disconnected."); Log.DebugFormat("Setup {0}",client.Client.RemoteEndPoint); this.EndPoint = client.Client.RemoteEndPoint as IPEndPoint; this.MessageProcessor = processor; this.Client = client; this.Status = SocketStatus.Connected; } this.CallOnConnectionEvent(this.FirstConnection ? SocketConnectionEvent.Connected : SocketConnectionEvent.Reconnected); this.FirstConnection = false; var bundle = new SocketReceiveBundle(this.Client); this.Client.Client.BeginReceive( bundle.Buffer, 0, SocketReceiveBundle.BufferSize, SocketFlags.None, this.EndReceive, bundle); }