Example #1
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 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();
                }
            }
        }