private static void SendCompleted(SocketAsyncEventArgs e) { SocketAsyncEventArgsX ex = (SocketAsyncEventArgsX)e; Buffers.Buffer buffer = (Buffers.Buffer)ex.BufferX; AsyncTcpClient tcpclient = (AsyncTcpClient)e.UserToken; try { if (e.SocketError == SocketError.IOPending || e.SocketError == SocketError.Success) { System.Threading.Interlocked.Increment(ref tcpclient.mSendQuantity); tcpclient.mSendBytes += e.BytesTransferred; if (e.BytesTransferred < e.Count) { buffer.Postion = buffer.Postion + e.BytesTransferred; buffer.SetLength(buffer.Length - e.BytesTransferred); buffer.AsyncTo(tcpclient.mSendEventArgs, tcpclient.Socket); } else { IBuffer nextbuf = buffer.Next; try { buffer.Completed?.Invoke(buffer); } catch { } buffer.Free(); if (nextbuf != null) { tcpclient.CommitBuffer(nextbuf); } else { tcpclient.SendCompleted(); } } } else { Buffers.Buffer.Free(ex.BufferX); tcpclient.DisConnect(); tcpclient.ProcessError(new SocketException((int)e.SocketError), $"Send error {e.SocketError}"); } if (tcpclient.SocketProcessHandler != null) { tcpclient.SocketProcessHandler.SendCompleted(tcpclient, e); } } catch (Exception e_) { tcpclient.ProcessError(e_, "client network send error!"); } }
private void BeginReceive() { if (IsConnected) { Buffers.Buffer buffer = (Buffers.Buffer)ReceiveBufferPool.Pop(); buffer.UserToken = this; try { buffer.AsyncFrom(mReceiveEventArgs, mSocket); } catch (Exception e_) { buffer.Free(); DisConnect(); ProcessError(e_, "client begin network receive error!"); } } }
public void BeginReceive() { if (IsConnected && System.Threading.Interlocked.Exchange(ref mReceiveState, 1) == 0) { Buffers.Buffer buffer = (Buffers.Buffer)BufferPool.Pop(); buffer.UserToken = this; try { buffer.AsyncFrom(mReceiveEventArgs, mSocket);/// see ref=<see cref="SocketAsyncEventArgs.Completed"/> } catch (Exception e_) { InitReceiveState(); buffer.Free(); DisConnect(); ProcessError(e_, "client begin network receive error!"); } } }
private void BeginReceive() { if (IsConnected) { Buffers.Buffer buffer = (Buffers.Buffer)BufferPool.ReceiveDefault.Pop(); if (!buffer.BindIOCompleted) { buffer.BindIOEvent(IO_Completed); } buffer.UserToken = this; try { buffer.AsyncFrom(mSocket); } catch (Exception e_) { buffer.Free(); DisConnect(); ProcessError(e_, "client begin network receive error!"); } } }