/// <summary> /// Processes to send a <see cref="Message"/> using the specified <see cref="SocketAsyncEventArgs"/>. /// </summary> /// <param name="AsyncEvent">The <see cref="SocketAsyncEventArgs"/> instance containing the event data.</param> private static void ProcessSend(SocketAsyncEventArgs AsyncEvent) { NetworkToken Token = (NetworkToken)AsyncEvent.UserToken; if (AsyncEvent.SocketError == SocketError.Success) { if (AsyncEvent.Count > AsyncEvent.BytesTransferred) { int Offset = AsyncEvent.Offset + AsyncEvent.BytesTransferred; if (Token.IsConnected) { AsyncEvent.SetBuffer(Offset, AsyncEvent.Buffer.Length - Offset); if (!Token.Socket.SendAsync(AsyncEvent)) { NetworkTcp.ProcessSend(AsyncEvent); } return; } NetworkTcp.Disconnect(Token.AsyncEvent); } } else { NetworkTcp.Disconnect(Token.AsyncEvent); } NetworkTcp.OnSendCompleted(null, AsyncEvent); }
/// <summary> /// Sends the specified message. /// </summary> /// <param name="Buffer">The buffer.</param> /// <param name="Token">The token.</param> public static void Send(byte[] Buffer, NetworkToken Token) { if (Buffer == null) { throw new ArgumentNullException(nameof(Message), "Buffer == null at Send(Buffer, Token)."); } if (Token == null) { throw new ArgumentNullException(nameof(Token), "Token == null at Send(Buffer, Token)."); } if (Token.IsConnected) { SocketAsyncEventArgs WriteEvent = NetworkTcp.WritePool.Dequeue(); if (WriteEvent == null) { WriteEvent = new SocketAsyncEventArgs { DisconnectReuseSocket = false }; } WriteEvent.SetBuffer(Buffer, 0, Buffer.Length); WriteEvent.AcceptSocket = Token.Socket; WriteEvent.RemoteEndPoint = Token.Socket.RemoteEndPoint; WriteEvent.UserToken = Token; if (!Token.Socket.SendAsync(WriteEvent)) { NetworkTcp.ProcessSend(WriteEvent); } } else { NetworkTcp.Disconnect(Token.AsyncEvent); } }