//TODO: Fix alloction per socket accept and remo task. public static async Task<Socket> AcceptSocketAsync(this Socket listenSocket, SocketAwaitableEventArgs awaitable) { await AcceptAsync(listenSocket, awaitable); var acceptSocket = awaitable.AcceptSocket; awaitable.AcceptSocket = null; return acceptSocket; }
public static async Task<IDisposableConnection<ArraySegment<byte>>> CreateConnection( EndPoint endpoint, SocketType socketType = SocketType.Stream, ProtocolType protocolType = ProtocolType.Tcp) { var socket = new Socket(socketType, protocolType); bool disposeSocket = false; try { using (SocketAwaitableEventArgs args = new SocketAwaitableEventArgs()) { args.RemoteEndPoint = endpoint; await socket.ConnectSocketAsync(args); } } catch (Exception) { disposeSocket = true; throw; } finally { if (disposeSocket) { socket.Dispose(); socket = null; } } return socket.ToConnection(); }
static SocketAwaitableEventArgs OperationAsync(this Socket socket, SocketAwaitableEventArgs awaitable, SocketOperationDelegate socketFunc) { awaitable.StartOperation(); if (!socketFunc(socket, awaitable)) { awaitable.CompleteOperation(); } return awaitable; }
public static SocketAwaitableEventArgs SendSocketAsync(this Socket socket, SocketAwaitableEventArgs awaitable) { return OperationAsync(socket, awaitable, SendAsyncHandler); }
public static SocketAwaitableEventArgs ReceiveSocketAsync(this Socket socket, SocketAwaitableEventArgs awaitable) { return OperationAsync(socket, awaitable, ReceiveAsyncHandler); }
public static SocketAwaitableEventArgs ConnectSocketAsync(this Socket socket, SocketAwaitableEventArgs awaitable) { return OperationAsync(socket, awaitable, ConnectAsyncHandler); }