unsafe void ListenIocpComplete(object o) { IntPtr lpNumberOfBytes; IntPtr lpCompletionKey; RioNativeOverlapped *lpOverlapped = stackalloc RioNativeOverlapped[1]; int lpcbTransfer; int lpdwFlags; while (true) { if (Kernel32.GetQueuedCompletionStatusRio(_listenIocp, out lpNumberOfBytes, out lpCompletionKey, out lpOverlapped, -1)) { if (WinSock.WSAGetOverlappedResult(_listenerSocket, lpOverlapped, out lpcbTransfer, false, out lpdwFlags)) { var res = allSockets[lpOverlapped->SocketIndex]; activeSockets.TryAdd(res.GetHashCode(), res); OnAccepted(res); } else { //recycle socket } } else { var error = Marshal.GetLastWin32Error(); if (error != 0 && error != 64) //connection no longer available { throw new Win32Exception(error); } } } }
protected override unsafe void SocketIocpComplete(object o) { IntPtr lpNumberOfBytes; IntPtr lpCompletionKey; RioNativeOverlapped *lpOverlapped = stackalloc RioNativeOverlapped[1]; TaskCompletionSource <RioConnectionOrientedSocket> r; RioConnectionOrientedSocket res; int lpcbTransfer; int lpdwFlags; while (true) { if (Kernel32.GetQueuedCompletionStatusRio(socketIocp, out lpNumberOfBytes, out lpCompletionKey, out lpOverlapped, -1)) { if (lpOverlapped->Status == 1) { _freeSockets.Enqueue(allSockets[lpOverlapped->SocketIndex]); } else if (lpOverlapped->Status == 2) { if (WinSock.WSAGetOverlappedResult(allSockets[lpOverlapped->SocketIndex].Socket, lpOverlapped, out lpcbTransfer, false, out lpdwFlags)) { res = allSockets[lpOverlapped->SocketIndex]; activeSockets.TryAdd(res.GetHashCode(), res); if (_ongoingConnections.TryRemove(res, out r)) { r.SetResult(res); } } else { //recycle socket } } } //1225 else { var error = Marshal.GetLastWin32Error(); if (error != 0 && error != 64 & error != 1225) //connection no longer available { throw new Win32Exception(error); } else { res = allSockets[lpOverlapped->SocketIndex]; _freeSockets.Enqueue(allSockets[lpOverlapped->SocketIndex]); if (_ongoingConnections.TryRemove(res, out r)) { r.SetException(new Win32Exception(error)); } } } } }