public async Task SendAsync(byte[] buffer, int offset, int len, Action <int> callback) { if (secure) { SecureStream.Encrypt(buffer, offset, len); } int bytes = -1; try { SocketAsyncEventArgs sockArgs; if (!sendQueue.TryDequeue(out sockArgs)) { sockArgs = new SocketAsyncEventArgs(); } sockArgs.SetBuffer(buffer, offset, len); sockArgs.Completed += SockArgsSend_Completed; sockArgs.UserToken = callback; if (!socket.SendAsync(sockArgs)) { SockArgsSend_Completed(socket, sockArgs); } } catch (ObjectDisposedException) { } catch (SocketException ex) { Console.WriteLine("[WARN] SendAsync | SocketError=" + ex.SocketErrorCode); } }
private void SockArgsRecv_Completed(object sender, SocketAsyncEventArgs e) { var callback = e.UserToken as Func <int, Task>; e.Completed -= SockArgsRecv_Completed; if (e.LastOperation == SocketAsyncOperation.Receive) { recvQueue.Enqueue(e); } Console.WriteLine("{0} {1} <= {2} {3}", "RECV", this.LocalEndPoint.ToString().PadRight(22), this.RemoteEndPoint.ToString().PadRight(22), e.BytesTransferred); if (secure && e.BytesTransferred > 0) { SecureStream.Decrypt(e.Buffer, 0, e.BytesTransferred); } callback(e.BytesTransferred).Wait(); }
private void SockArgsSend_Completed(object sender, SocketAsyncEventArgs e) { var callback = e.UserToken as Action <int>; e.Completed -= SockArgsSend_Completed; if (e.LastOperation == SocketAsyncOperation.Send) { sendQueue.Enqueue(e); } Console.WriteLine("{0} {1} => {2} {3}", "SEND", this.LocalEndPoint.ToString().PadRight(22), this.RemoteEndPoint.ToString().PadRight(22), e.BytesTransferred); if (secure && e.BytesTransferred > 0) { SecureStream.Decrypt(e.Buffer, 0, e.BytesTransferred); } callback(e.BytesTransferred); }