internal static async Task <Socket> ConnectAsync( 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); }
static SocketAwaitableEventArgs OperationAsync(this Socket socket, SocketAwaitableEventArgs awaitable, SocketOperationDelegate socketFunc) { awaitable.StartOperation(); if (!socketFunc(socket, awaitable)) { awaitable.CompleteOperation(); } return(awaitable); }
public Task Start() { ThrowIfDisposed(); var create = _createListenerFunc; if (Interlocked.CompareExchange(ref _createListenerFunc, null, create) != null) { try { _listenerSocket = create(); Events.Trace.CreateSocketListener(_listenerSocket.LocalEndPoint.ToString()); _awaitable = _socketAwaitableFactory.GetSocketAwaitable(); _startTcs.SetResult(_listenerSocket); } catch (Exception ex) { Events.Trace.Failure("Error creating socket listener." + ex.ToString()); _startTcs.SetException(ex); throw; } } return(_startTcs.Task); }
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)); }
//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); }