unsafe void AcceptIocpComplete(object o)
{
IntPtr lpNumberOfBytes;
IntPtr lpCompletionKey;
RioNativeOverlapped* lpOverlapped = stackalloc RioNativeOverlapped[1];
while (true)
{
if (Kernel32.GetQueuedCompletionStatusRio(_listenIocp, out lpNumberOfBytes, out lpCompletionKey, out lpOverlapped, -1))
{
var res = allSockets[lpOverlapped->SocketIndex];
activeSockets.TryAdd(res.GetHashCode(), res);
void* apa = _listenerSocket.ToPointer();
if (res.SetSocketOption(SOL_SOCKET_SocketOptions.SO_UPDATE_ACCEPT_CONTEXT, &apa, IntPtr.Size) != 0)
WinSock.ThrowLastWSAError();
res.SetInUse(true);
OnAccepted(res);
}
else
{
var error = Marshal.GetLastWin32Error();
if (error == Kernel32.ERROR_ABANDONED_WAIT_0)
break;
else if (error == Kernel32.ERROR_NETNAME_DELETED)
BeginRecycle(allSockets[lpOverlapped->SocketIndex],false);
else
throw new Win32Exception(error);
}
}
}