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