Ejemplo n.º 1
0
        protected override unsafe bool SocketIocpOk(RioConnectionOrientedSocket socket, byte status)
        {
            if (status == 1)
            {
                ThreadPool.QueueUserWorkItem(oo =>
                {
                    EndRecycle((RioConnectionOrientedSocket)oo, true);
                }, socket);
            }
            else if (status == 2)
            {
                TaskCompletionSource <RioSocket> r;
                activeSockets.TryAdd(socket.GetHashCode(), socket);
                socket.SetInUse(true);
                if (socket.SetSocketOption(SOL_SOCKET_SocketOptions.SO_UPDATE_CONNECT_CONTEXT, (void *)0, 0) != 0)
                {
                    WinSock.ThrowLastWSAError();
                }

                if (_ongoingConnections.TryRemove(socket, out r))
                {
                    ThreadPool.QueueUserWorkItem(oo =>
                    {
                        var rr = (Tuple <TaskCompletionSource <RioSocket>, RioConnectionOrientedSocket>)oo;
                        rr.Item1.SetResult(rr.Item2);
                    }, Tuple.Create(r, socket));
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        protected override unsafe bool SocketIocpOk(RioConnectionOrientedSocket socket, byte status)
        {

            if (status == 1)
            {
                ThreadPool.QueueUserWorkItem(oo =>
                {
                    EndRecycle((RioConnectionOrientedSocket)oo, true);
                }, socket);
            }
            else if (status == 2)
            {
                TaskCompletionSource<RioSocket> r;
                activeSockets.TryAdd(socket.GetHashCode(), socket);
                socket.SetInUse(true);
                if (socket.SetSocketOption(SOL_SOCKET_SocketOptions.SO_UPDATE_CONNECT_CONTEXT, (void*)0, 0) != 0)
                    WinSock.ThrowLastWSAError();

                if (_ongoingConnections.TryRemove(socket, out r))
                    ThreadPool.QueueUserWorkItem(oo =>
                    {
                        var rr = (Tuple<TaskCompletionSource<RioSocket>, RioConnectionOrientedSocket>)oo;
                        rr.Item1.SetResult(rr.Item2);
                    }, Tuple.Create(r, socket));
            }

            return false;
        }