예제 #1
0
        public async Task <int> ReceiveAsync(ArraySegment <byte> buffer)
        {
            var awaitable = SocketAwaitablePool.Take();

            try
            {
                awaitable.EventArgs.SetBuffer(buffer.Array, buffer.Offset, buffer.Count);
                await _socket.ReceiveAsync(awaitable);

                return(awaitable.EventArgs.BytesTransferred);
            }
            finally
            {
                SocketAwaitablePool.Add(awaitable);
            }
        }
예제 #2
0
        public async Task <int> ReceiveAsync(byte[] array, int offset, int count)
        {
            var awaitableSocket = AwaitableSocketPool.Take();

            awaitableSocket.EventArgs.SetBuffer(array, offset, count);

            try
            {
                await _socket.ReceiveAsync(awaitableSocket);

                int bytesRead = awaitableSocket.EventArgs.BytesTransferred;
                return(bytesRead);
            }
            finally
            {
                AwaitableSocketPool.Add(awaitableSocket);
            }
        }
예제 #3
0
        public void Receive(BufferManager.Buffer buffer, ConnectionIoCallback callback)
        {
            if (CheckDisconnectedOrDisposed(callback))
            {
                return;
            }

            var recvAsyncEventArgs = SendRecvSaeaPool.Take();

            recvAsyncEventArgs.UserToken  = callback;
            recvAsyncEventArgs.BufferList = buffer.ToArraySegmentList();
            var async = _socket.ReceiveAsync(recvAsyncEventArgs);

            if (!async)
            {
                SendRecvCompleted(null, recvAsyncEventArgs);
            }
        }
예제 #4
0
        private void Listen()
        {
            var saea = ConnectSaeaPool.Take();

            saea.AcceptSocket = null;
            saea.Completed   += IOCompleted;
            if (_status == ListenerStatus.Stopped)
            {
                return;
            }

            var async = Listener.AcceptAsync(saea);

            if (!async)
            {
                IOCompleted(null, saea);
            }
        }
예제 #5
0
        public void Connect(ConnectionConnectCallback callback)
        {
            if (_socketDisposed)
            {
                callback(false); return;
            }

            var connectAsyncEventArgs = ConnectSaeaPool.Take();

            connectAsyncEventArgs.UserToken      = callback;
            connectAsyncEventArgs.RemoteEndPoint = Endpoint;
            var async = _socket.ConnectAsync(connectAsyncEventArgs);

            if (!async)
            {
                ConnectCompleted(null, connectAsyncEventArgs);
            }
        }