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);
        }
Example #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;
        }
Example #3
0
        unsafe void BeginAccept(RioConnectionOrientedSocket acceptSocket)
        {
            int recived = 0;

            acceptSocket.ResetOverlapped();
            if (!RioStatic.AcceptEx(_listenerSocket, acceptSocket.Socket, acceptSocket._adressBuffer, 0, sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16, out recived, acceptSocket._overlapped))
            {
                WinSock.ThrowLastWSAError();
            }
            else
            {
                acceptSocket.SetInUse(true);
                OnAccepted(acceptSocket);
            }
        }
Example #4
0
 unsafe void BeginAccept(RioConnectionOrientedSocket acceptSocket)
 {
     int recived = 0;
     acceptSocket.ResetOverlapped();
     if (!RioStatic.AcceptEx(_listenerSocket, acceptSocket.Socket, acceptSocket._adressBuffer, 0, sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16, out recived, acceptSocket._overlapped))
     {
         WinSock.ThrowLastWSAError();
     }
     else
     {
         acceptSocket.SetInUse(true);
         OnAccepted(acceptSocket);
     }
 }