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
        internal void EndRecycle(RioConnectionOrientedSocket socket, bool async)
        {
            RioConnectionOrientedSocket s;

            disconnectingSockets.TryRemove(socket.GetHashCode(), out s);
            socket.pendingRecives = 0;
            socket.pendingSends   = 0;
            FinalizeRecycle(socket);
        }
 internal unsafe virtual void Recycle(RioConnectionOrientedSocket socket)
 {
     RioSocket c;
     activeSockets.TryRemove(socket.GetHashCode(), out c);
     socket.ResetOverlapped();
     socket._overlapped->Status = 1;
     if (!RioStatic.DisconnectEx(socket.Socket, socket._overlapped, disconnectexflag, 0)) //TF_REUSE_SOCKET
         if (WinSock.WSAGetLastError() != 997) // error_io_pending
             WinSock.ThrowLastWSAError();
     //else
     //    AcceptEx(socket);
 }
Example #5
0
        internal unsafe virtual void BeginRecycle(RioConnectionOrientedSocket socket, bool force)
        {
            RioConnectionOrientedSocket c;

            activeSockets.TryRemove(socket.GetHashCode(), out c);

            if (force || socket.Socket == IntPtr.Zero || socket.pendingRecives > 0 || socket.pendingSends > 0)
            {
                socket.ResetSocket();
                if ((Kernel32.CreateIoCompletionPort(socket.Socket, socketIocp, 0, 1)) == IntPtr.Zero)
                {
                    Kernel32.ThrowLastError();
                }
                InitializeSocket(socket);
                EndRecycle(socket, false);
            }
            else
            {
                disconnectingSockets.TryAdd(socket.GetHashCode(), socket);
                socket.disconnectStartTime = CurrentTime;

                socket._overlapped->Status = 1;
                if (!RioStatic.DisconnectEx(socket.Socket, socket._overlapped, WinSock.TF_REUSE_SOCKET, 0))
                {
                    var error = WinSock.WSAGetLastError();
                    if (error == WinSock.WSAENOTCONN || error == 10038)
                    {
                        BeginRecycle(socket, true);
                    }

                    else
                    {
                        WinSock.ThrowLastWSAError();
                    }
                }
            }
        }
        internal unsafe virtual void Recycle(RioConnectionOrientedSocket socket)
        {
            RioSocket c;

            activeSockets.TryRemove(socket.GetHashCode(), out c);
            socket.ResetOverlapped();
            socket._overlapped->Status = 1;
            if (!RioStatic.DisconnectEx(socket.Socket, socket._overlapped, disconnectexflag, 0)) //TF_REUSE_SOCKET
            {
                if (WinSock.WSAGetLastError() != 997)                                            // error_io_pending
                {
                    WinSock.ThrowLastWSAError();
                }
            }
            //else
            //    AcceptEx(socket);
        }
        internal unsafe virtual void BeginRecycle(RioConnectionOrientedSocket socket, bool force)
        {
            RioConnectionOrientedSocket c;
            activeSockets.TryRemove(socket.GetHashCode(), out c);

            if (force || socket.Socket == IntPtr.Zero || socket.pendingRecives > 0 || socket.pendingSends > 0)
            {
                socket.ResetSocket();
                if ((Kernel32.CreateIoCompletionPort(socket.Socket, socketIocp, 0, 1)) == IntPtr.Zero)
                    Kernel32.ThrowLastError();
                InitializeSocket(socket);
                EndRecycle(socket, false);
            }
            else
            {
                disconnectingSockets.TryAdd(socket.GetHashCode(), socket);
                socket.disconnectStartTime = CurrentTime;

                socket._overlapped->Status = 1;
                if (!RioStatic.DisconnectEx(socket.Socket, socket._overlapped, WinSock.TF_REUSE_SOCKET, 0))
                {
                    var error = WinSock.WSAGetLastError();
                    if (error == WinSock.WSAENOTCONN || error == 10038)
                        BeginRecycle(socket, true);

                    else
                        WinSock.ThrowLastWSAError();
                }
            }
        }
 internal void EndRecycle(RioConnectionOrientedSocket socket, bool async)
 {
     RioConnectionOrientedSocket s;
     disconnectingSockets.TryRemove(socket.GetHashCode(), out s);
     socket.pendingRecives = 0;
     socket.pendingSends = 0;
     FinalizeRecycle(socket);
 }