示例#1
0
		/// <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;
		}
示例#2
0
		/// <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);
		}