Example #1
0
        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);
        }
Example #2
0
        static SocketAwaitableEventArgs OperationAsync(this Socket socket, SocketAwaitableEventArgs awaitable, SocketOperationDelegate socketFunc)
        {
            awaitable.StartOperation();

            if (!socketFunc(socket, awaitable))
            {
                awaitable.CompleteOperation();
            }

            return(awaitable);
        }
Example #3
0
        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);
        }
Example #4
0
 public static SocketAwaitableEventArgs SendSocketAsync(this Socket socket, SocketAwaitableEventArgs awaitable)
 {
     return(OperationAsync(socket, awaitable, SendAsyncHandler));
 }
Example #5
0
 public static SocketAwaitableEventArgs ReceiveSocketAsync(this Socket socket, SocketAwaitableEventArgs awaitable)
 {
     return(OperationAsync(socket, awaitable, ReceiveAsyncHandler));
 }
Example #6
0
        //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);
        }