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; }
unsafe void BeginAccept(RioConnectionOrientedSocket acceptSocket) { int recived = 0; acceptSocket.ResetOverlapped(); if (!RioStatic.AcceptEx(_listenerSocket, acceptSocket.Socket, acceptSocket._adressBuffer, 0, sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16, out recived, acceptSocket._overlapped)) { WinSock.ThrowLastWSAError(); } else { acceptSocket.SetInUse(true); OnAccepted(acceptSocket); } }