private static void DoSend(Socket socket, SocketAwaitableEventArgs args, ReadOnlyMemory <byte> memory, string name) { // The BufferList getter is much less expensive then the setter. if (args.BufferList != null) { args.BufferList = null; } #if SOCKET_STREAM_BUFFERS args.SetBuffer(MemoryMarshal.AsMemory(memory)); #else var segment = memory.GetArray(); args.SetBuffer(segment.Array, segment.Offset, segment.Count); #endif Helpers.DebugLog(name, $"## {nameof(socket.SendAsync)} {memory.Length}"); if (socket.SendAsync(args)) { Helpers.Incr(Counter.SocketSendAsyncSingleAsync); } else { Helpers.Incr(Counter.SocketSendAsyncSingleSync); args.Complete(); } }
private static void DoSend(Socket socket, SocketAwaitableEventArgs args, ReadOnlySequence <byte> buffer, string name) { if (buffer.IsSingleSegment) { DoSend(socket, args, buffer.First, name); return; } #if SOCKET_STREAM_BUFFERS if (!args.MemoryBuffer.IsEmpty) #else if (args.Buffer != null) #endif { args.SetBuffer(null, 0, 0); } args.BufferList = GetBufferList(args, buffer); Helpers.DebugLog(name, $"## {nameof(socket.SendAsync)} {buffer.Length}"); if (socket.SendAsync(args)) { Helpers.Incr(Counter.SocketSendAsyncMultiAsync); } else { Helpers.Incr(Counter.SocketSendAsyncMultiSync); args.Complete(); } }
/// <summary> /// Open a new or existing socket as a client /// </summary> public static async Task <SocketConnection> ConnectAsync( EndPoint endpoint, PipeOptions sendPipeOptions, PipeOptions receivePipeOptions, SocketConnectionOptions connectionOptions = SocketConnectionOptions.None, Func <SocketConnection, Task> onConnected = null, Socket socket = null, string name = null) { AssertDependencies(); var addressFamily = endpoint.AddressFamily == AddressFamily.Unspecified ? AddressFamily.InterNetwork : endpoint.AddressFamily; var protocolType = addressFamily == AddressFamily.Unix ? ProtocolType.Unspecified : ProtocolType.Tcp; if (socket == null) { socket = new Socket(addressFamily, SocketType.Stream, protocolType); } if (sendPipeOptions == null) { sendPipeOptions = PipeOptions.Default; } if (receivePipeOptions == null) { receivePipeOptions = PipeOptions.Default; } SetRecommendedClientOptions(socket); using (var args = new SocketAwaitableEventArgs((connectionOptions & SocketConnectionOptions.InlineConnect) == 0 ? PipeScheduler.ThreadPool : null)) { args.RemoteEndPoint = endpoint; Helpers.DebugLog(name, $"connecting to {endpoint}..."); if (!socket.ConnectAsync(args)) { args.Complete(); } await args; } Helpers.DebugLog(name, "connected"); var connection = Create(socket, sendPipeOptions, receivePipeOptions, connectionOptions, name); if (onConnected != null) { await onConnected(connection).ConfigureAwait(false); } return(connection); }