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