/// <summary> /// Tries to initialize the Registered I/O handle. /// </summary> /// <param name="socket">A descriptor that identifies a socket.</param> /// <param name="result">Contains valid object if operation was successful, <c>null</c> otherwise.</param> /// <returns><c>true</c> if operation was successful, <c>false</c> otherwise.</returns> public static unsafe Boolean TryCreate(SOCKET socket, out RIOHandle result) { // get function table id var functionTableId = WinsockInterop.WSAID_MULTIPLE_RIO; // initialize functions table var functionTable = new RIO_EXTENSION_FUNCTION_TABLE(); // get table size var tableSize = (UInt32) sizeof(RIO_EXTENSION_FUNCTION_TABLE); // will contain actual table size UInt32 actualTableSize; // try get registered IO functions table var tryGetTableResult = WinsockInterop.WSAIoctl(socket, WinsockInterop.SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &functionTableId, 16, &functionTable, tableSize, out actualTableSize, IntPtr.Zero, IntPtr.Zero); // check if attempt was successful if (tryGetTableResult == WinsockInterop.SOCKET_ERROR) { result = null; // return fail return false; } // create registered I/O handle result = new RIOHandle(ref functionTable); // return success return true; }
/// <summary> /// Initializes a new instance of <see cref="RIOHandle" /> class. /// </summary> /// <param name="table">The reference to the table of the functions pointers.</param> public RIOHandle(ref RIO_EXTENSION_FUNCTION_TABLE table) { registerBuffer = Marshal.GetDelegateForFunctionPointer<RIORegisterBuffer>(table.RIORegisterBuffer); createCompletionQueue = Marshal.GetDelegateForFunctionPointer<RIOCreateCompletionQueue>(table.RIOCreateCompletionQueue); createRequestQueue = Marshal.GetDelegateForFunctionPointer<RIOCreateRequestQueue>(table.RIOCreateRequestQueue); notify = Marshal.GetDelegateForFunctionPointer<RIONotify>(table.RIONotify); dequeueCompletion = Marshal.GetDelegateForFunctionPointer<RIODequeueCompletion>(table.RIODequeueCompletion); receive = Marshal.GetDelegateForFunctionPointer<RIOReceive>(table.RIOReceive); send = Marshal.GetDelegateForFunctionPointer<RIOSend>(table.RIOSend); closeCompletionQueue = Marshal.GetDelegateForFunctionPointer<RIOCloseCompletionQueue>(table.RIOCloseCompletionQueue); deregisterBuffer = Marshal.GetDelegateForFunctionPointer<RIODeregisterBuffer>(table.RIODeregisterBuffer); resizeCompletionQueue = Marshal.GetDelegateForFunctionPointer<RIOResizeCompletionQueue>(table.RIOResizeCompletionQueue); resizeRequestQueue = Marshal.GetDelegateForFunctionPointer<RIOResizeRequestQueue>(table.RIOResizeRequestQueue); }